背景:
在iOS10.3之前如果想替換APP的圖標,必須通過Assets.xcassets添加AppIcon,而且是唯一指定的,不能夠修改。
iOS10.3之后,系統提供了修改AppIcon的API,可以通過內置幾個不同的icon,然后通過代碼設置不同的AppIcon。
核心API:
// Pass `nil` to use the primary application icon. The completion handler will be invoked asynchronously on an arbitrary background queue; be sure to dispatch back to the main queue before doing any further UI work.
//如果name設置為nil,會自動讀取主app icon
- (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));
官方文檔:
1790503-ee6ee4b631758c62.png
info.plist具體配置:
E7A2F9BA-73EE-414A-9CC1-F67832B4882B.png
3F612363-EF6C-4F96-BA38-AA672E3D245D.png
Primary Icon 字段設置為AppIcon(就是asset里面的名字),如果設置appicon的API的name參數設置為nil,會自動讀取Primary Icon對應的圖片,
Test1是用來替換原生圖標的圖片資源,文件名需要和info.plist中保持一致,需要注意的是 圖片資源需要放在外邊,不能放在asset資源里面。
具體實現代碼
- (IBAction)testClick:(id)sender {
[[UIApplication sharedApplication] setAlternateIconName:@"Test1" completionHandler:^(NSError * _Nullable error) {
NSLog(@"error = %@",error.localizedDescription);
}];
}
- (IBAction)test2Click:(id)sender {
[[UIApplication sharedApplication] setAlternateIconName:@"Test2" completionHandler:^(NSError * _Nullable error) {
NSLog(@"error = %@",error.localizedDescription);
}];
}
- (IBAction)emptyClick:(id)sender {
[[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) {
NSLog(@"error = %@",error.localizedDescription);
}];
}
實現效果:
修改前:
Simulator Screen Shot 2017年3月31日 下午5.06.35.png
點擊按鈕修改:
Simulator Screen Shot 2017年3月31日 下午5.06.48.png
修改后:
Simulator Screen Shot 2017年3月31日 下午5.07.03.png