应用场景
-
各类皮肤主题切换,附带App图标一块更换。
-
图标促销提示,如某宝双11购物节,提前更换App图标。
起跳版本
- iOS10.3 开始支持
实现方案
-
核心API:
|
@interfaceUIApplication (UIAlternateApplicationIcons)// 如果为NO,表示当前进程不支持替换图标@property(readonly, nonatomic) BOOL supportsAlternateIcons NS_EXTENSION_UNAVAILABLE(``"Extensions may not have alternate icons"``) API_AVAILABLE(ios(``10.3``), tvos(``10.2``));// 传入nil代表使用主图标. 完成后的操作将会在任意的后台队列中异步执行; 如果需要更改UI,请确保在主队列中执行.- (``void``)setAlternateIconName:(nullable NSString *)alternateIconName completionHandler:(nullablevoid(^)(NSError *_Nullable error))completionHandler NS_EXTENSION_UNAVAILABLE(``"Extensions may not have alternate icons"``) API_AVAILABLE(ios(``10.3``), tvos(``10.2``));// 如果alternateIconName为nil,则代表当前使用的是主图标.@property(nullable, readonly, nonatomic) NSString *alternateIconName NS_EXTENSION_UNAVAILABLE(``"Extensions may not have alternate icons"``) API_AVAILABLE(ios(``10.3``), tvos(``10.2``));@end|
-
图标的配置方法:
Info.plist是个字典,假设为NSDictionary *infoPlist。
CFBundleIcons是Info.plist字典里的一个键@"CFBundleIcons"。
CFBundleIcons对应的value是个字典。
CFBundleIcons里面能够包含的键有:CFBundlePrimaryIcon、CFBundleAlternateIcons、UINewsstandIcon。
官方说明图:
[图片上传中...(image-5277da-1513778061805-1)]项目具体配置图:
[图片上传中...(image-fe6f7e-1513778061805-0)]
-
其他注意事项
- 文件扩展名,如@2x,@3x,要么统一不写,那么系统会自动寻找合适的尺寸。要写就需要把每张icon的扩展名写上。
- <pre style="margin: 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">iPad版本如果需要有更换的图标,需要在CFBundleIcons〜ipad同样设置一次。</pre>
-
<pre style="margin: 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">特别注意:动态更换的icon不支持云端图片,需要预放在ipa包里面,且不能使用assets打包;因此****会增加ipa的体积。</pre>
-
部分代码
|
- (``void``)changeAppIcon {if([UIApplication sharedApplication].supportsAlternateIcons) {//TODO}``else``{//TODOreturn``;}NSString *iconName = [[UIApplication sharedApplication] alternateIconName];if(iconName) {// change to primary icon[[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) {if(error) {//TODO}else{//TODO}}];}``else``{// change to alterante icon[[UIApplication sharedApplication] setAlternateIconName:@``"renrenche"completionHandler:^(NSError * _Nullable error) {if(error) {//TODO}else{//TODO}}];}}|














网友评论