iOS 高性能置灰方案
全局动态置灰,很多App都会在特殊节日比如清明或者其他哀悼日使用哀悼置灰。
对于置灰操作,如果是每次都更新版本,肯定就来不及,一般处理方式为后台设置按钮开关,处理对应日子开启置灰操作。
另外还有一些特殊的业务要求,比如首页页面置灰,而其他页面不置灰。本文将详细探讨实现和配置的细节,力求提供完整方案。
全局置灰实现:
思路: 给视图加上饱和度为0的滤镜。即 window 的 layer 上设置 filters。
- 生成CAFilter 颜色饱和度滤镜
复制代码
1
2CAFilter *filter = [CAFilter filterWithName:colorSaturate];
- 设置饱和度为0
复制代码
1
2[filter inputAmount:0];
- 赋值给 window (此处可以替换为keywindow)
复制代码
1
2[NMIoc_App appDelegate].window.layer.filters = @[filter];
部分页面置灰实现:
- 在App启动时通过配置中心获取执行黑/白名单模式,以及页面黑名单和页面白名单
- Hook
viewWillAppear
和viewDidDisappear
,判断是否处于命中页面 viewWillAppear
设置 window 的滤镜viewDidDisappear
移除 window 滤镜
不把饱和度滤镜加 window 上的话,可能会导致首屏
tabbar
等元素是彩色的。
实现的细节:
- App前后台切换,需要更新滤镜状态
- 配置变更时更新配置
配置数据样例
缺省配置
复制代码
1
2
3
4
5
6
7
8
9[ { "type":"colorSaturateZero", "strategy":"none", "startTime":1234567890,//单位毫秒 "endTime":1234567890//单位毫秒 } ]
全局配置
复制代码
1
2
3
4
5
6
7
8
9[ { "type":"colorSaturateZero", "strategy":"global", "startTime":1234567890, "endTime":1234567890 } ]
白名单模式
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[ { "type":"colorSaturateZero", "strategy":"whitelist", "startTime":1234567890, "endTime":1234567890, "iOSIdentify":[ "需要置灰的页面A", "需要置灰的页面B" ], "androidIdentify":[ "需要置灰的页面A", "需要置灰的页面B" ] } ]
黑名单模式
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[ { "type":"colorSaturateZero", "strategy":"blacklist", "startTime":1234567890, "endTime":1234567890, "iOSIdentify":[ "不需要置灰的页面A", "不需要置灰的页面B" ], "androidIdentify":[ "不需要置灰的页面A", "不需要置灰的页面B" ] } ]
特殊处理
*音乐 iPad 端页面
- 大部分分屏页面都没有
viewWillAppear
和viewDidDisappear
事件,需要结合监听kNavigationPageChangedNotification
通知来获取页面变动事件。 - 需要额外 Hook
View
的生命周期。在通知产生后核对顶部视图的状态,如果命中置灰逻辑,则将VC对应的View
记录下来,在HookView
的生命周期时对记录的View
进行置灰处理。 - 分屏页面的出现导致无法使用
windows
滤镜,会污染被部分展示的白名单页面。所以只能设置VC
对应view
的滤镜。
广告页的异常情况
在*音乐iPhone端中,广告视图是另外创建的window
,需要覆盖广告window
的话,还需要Hook UIWindow
makeKeyAndVisible
来达到对新展示的window
的覆盖效果。
最后
以上就是安静大米最近收集整理的关于iOS 高性能置灰方案iOS 高性能置灰方案的全部内容,更多相关iOS内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复