動態(tài)更換App圖標(biāo)這件事,在用戶里總是存在需求的:有些用戶喜歡“美化”自己的手機(jī)。至于用戶們喜歡美化到什么程度,這得看個(gè)人需求。有的用戶想定制個(gè)性的App圖標(biāo),那么各大iPhone論壇里都有方法可以不越獄更改App圖標(biāo);有的用戶想讓App圖標(biāo)“動”起來(如系統(tǒng)應(yīng)用時(shí)鐘),那么不越個(gè)獄還真不好辦。
在不重新安裝App的情況下,可以實(shí)現(xiàn)更新App的圖標(biāo)。但是會彈出一個(gè)提示,告知用戶當(dāng)前圖標(biāo)已更換。
應(yīng)用場景
- 白天/夜間模式切換,在切換App主色調(diào)同時(shí)切換App圖標(biāo)。
- 各類皮膚主題(淘寶就可換膚),附帶App圖標(biāo)一塊更換。
- 利用App圖標(biāo)表達(dá)某種特定功能,如Demo中的,提示當(dāng)前天氣。
- 圖標(biāo)促銷提示,如淘寶京東特定節(jié)日:11.11、6.18,提前更換App圖標(biāo)。
API
該功能(API)當(dāng)前只支持iOS10.3以上的系統(tǒng)。
@interface UIApplication (UIAlternateApplicationIcons)
// 如果為NO,表示當(dāng)前進(jìn)程不支持替換圖標(biāo)
@property (readonly, nonatomic) BOOL supportsAlternateIcons NS_EXTENSION_UNAVAILABLE("Extensions may not have alternate icons") API_AVAILABLE(ios(10.3), tvos(10.2));
// 傳入nil代表使用主圖標(biāo). 完成后的操作將會在任意的后臺隊(duì)列中異步執(zhí)行; 如果需要更改UI,請確保在主隊(duì)列中執(zhí)行.
- (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,則代表當(dāng)前使用的是主圖標(biāo).
@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 字典里的一個(gè)鍵,它對應(yīng)的value是個(gè)字典。
CFBundleIcons 里面能夠包含的鍵有:CFBundlePrimaryIcon、CFBundleAlternateIcons、UINewsstandIcon。
CFBundleAlternateIcons所對應(yīng)的value是個(gè)字典,字典中的鍵是備用圖標(biāo)的名字。
每個(gè)鍵對應(yīng)的value是個(gè)包含 CFBundleIconFiles 和 UIPrerenderedIcon 兩個(gè)鍵的字典。
CFBundleIconFiles 的value是字符串或者數(shù)組(數(shù)組內(nèi)容也為字符串)。字符串的內(nèi)容為各尺寸備用圖標(biāo)的名字。
UIPrerenderedIcon 的value是BOOL值。這個(gè)鍵值所代表的作用在iOS7之后(含iOS7)已失效,我們可以不用關(guān)心。
eg:
@"CFBundleAlternateIcons" : @{
@"newAppIcon1" : @{
@"CFBundleIconFiles" : @[
@"newAppIcon1_60"
],
@"UIPrerenderedIcon" : NO
},
@"newAppIcon2" : @{
@"CFBundleIconFiles" : @[
@"newAppIcon2_20",
@"newAppIcon2_29",
@"newAppIcon2_40",
@"newAppIcon2_60"
],
@"UIPrerenderedIcon" : NO
}
}
注意事項(xiàng)
- 文件擴(kuò)展名,如@2x,@3x,要么統(tǒng)一不寫,那么系統(tǒng)會自動尋找合適的尺寸;要寫就需要把每張icon的擴(kuò)展名寫上。
- 每個(gè)圖標(biāo),可以只提供最大的一張,其他的由操作系統(tǒng)生成;也可以提供全部所需的尺寸。