动态更换App图标这件事,在用户里总是存在需求的:有些用户喜欢“美化”自己的手机。至于用户们喜欢美化到什么程度,这得看个人需求。有的用户想定制个性的App图标,那么各大iPhone论坛里都有方法可以不越狱更改App图标;有的用户想让App图标“动”起来(如系统应用时钟),那么不越个狱还真不好办。
在不重新安装App的情况下,可以实现更新App的图标。但是会弹出一个提示,告知用户当前图标已更换。
应用场景
- 白天/夜间模式切换,在切换App主色调同时切换App图标。
- 各类皮肤主题(淘宝就可换肤),附带App图标一块更换。
- 利用App图标表达某种特定功能,如Demo中的,提示当前天气。
- 图标促销提示,如淘宝京东特定节日:11.11、6.18,提前更换App图标。
API
该功能(API)当前只支持iOS10.3以上的系统。
@interface UIApplication (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:(nullable void (^)(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
CFBundleIcons
是 Info.plist 字典里的一个键,它对应的value是个字典。
CFBundleIcons 里面能够包含的键有:CFBundlePrimaryIcon、CFBundleAlternateIcons、UINewsstandIcon。
CFBundleAlternateIcons
所对应的value是个字典,字典中的键是备用图标的名字。
每个键对应的value是个包含 CFBundleIconFiles 和 UIPrerenderedIcon 两个键的字典。
CFBundleIconFiles 的value是字符串或者数组(数组内容也为字符串)。字符串的内容为各尺寸备用图标的名字。
UIPrerenderedIcon 的value是BOOL值。这个键值所代表的作用在iOS7之后(含iOS7)已失效,我们可以不用关心。
eg:
@"CFBundleAlternateIcons" : @{
@"newAppIcon1" : @{
@"CFBundleIconFiles" : @[
@"newAppIcon1_60"
],
@"UIPrerenderedIcon" : NO
},
@"newAppIcon2" : @{
@"CFBundleIconFiles" : @[
@"newAppIcon2_20",
@"newAppIcon2_29",
@"newAppIcon2_40",
@"newAppIcon2_60"
],
@"UIPrerenderedIcon" : NO
}
}
注意事项
- 文件扩展名,如@2x,@3x,要么统一不写,那么系统会自动寻找合适的尺寸;要写就需要把每张icon的扩展名写上。
- 每个图标,可以只提供最大的一张,其他的由操作系统生成;也可以提供全部所需的尺寸。
网友评论