不重新上架更新 App Icon 圖標(biāo)
看到節(jié)假日手機(jī)里的App Icon沒有更新情況下自動(dòng)換了
版本要求:iOS 10.3
一占锯、配置
Info.plist內(nèi)添加Icon files (iOS 5)富蓄,默認(rèn)帶兩個(gè)key鸠蚪,這個(gè)不用管酪刀。按照下面格式添加新的key
<key>CFBundleIcons</key>
<dict>
<!-- 這一部分是用戶需要加進(jìn)去的 -->
<key>CFBundleAlternateIcons</key>
<dict>
<key>changeIcon1</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>tianxingjue</string>
</array>
</dict>
</dict>
<!-- changeIcon1可自定義房维,調(diào)用時(shí)候用changeIcon1驮配,可以有多個(gè)changeIcon2桃熄、changeIcon3等
tianxingjue是備用icon圖片名稱,圖片放在工程里--------- -->
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconName</key>
<string></string>
<key>CFBundleIconFiles</key>
<array>
<string></string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>UINewsstandIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string></string>
</array>
<key>UINewsstandBindingType</key>
<string>UINewsstandBindingTypeMagazine</string>
<key>UINewsstandBindingEdge</key>
<string>UINewsstandBindingEdgeLeft</string>
</dict>
</dict>
二恨锚、代碼部分
Swift
if UIApplication.shared.supportsAlternateIcons {
UIApplication.shared.setAlternateIconName(iconName) { error in
if error != nil {
print("\(#fileID) line:\(#line) \(#function) 換icon發(fā)生錯(cuò)誤宇驾,error: \(error!)")
} else {
print("\(#fileID) line:\(#line) \(#function) 換icon完成.")
}
}
}
OC
if ([[UIApplication sharedApplication] supportsAlternateIcons]) {
[[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {
if (error != nil) {
NSLog(@"%s line:%d 更新App圖標(biāo)失敗,錯(cuò)誤:%@", __func__, __LINE__, error);
} else {
NSLog(@"%s line:%d 更新App圖標(biāo)成功猴伶。", __func__, __LINE__);
}
}];
}
上面兩段代碼都會(huì)彈出更換icon的提示框课舍,體驗(yàn)很不好。
下一步是把這個(gè)提示框想辦法干掉
嘗試Swift方式取消彈窗無果他挎。
最后用oc代碼替換icon得以解決提示框問題:
+ (void)exchangeAlternateIcon:(NSString * _Nullable)iconName {
NSString *selectorStr = @"_set";
selectorStr = [selectorStr stringByAppendingString:@"Alternate"];
selectorStr = [selectorStr stringByAppendingString:@"IconName:"];
selectorStr = [selectorStr stringByAppendingString:@"completionHandler:"];
SEL selector = NSSelectorFromString(selectorStr);
IMP imp = [[UIApplication sharedApplication] methodForSelector:selector];
void (*setIcon)(id, SEL, NSString *, id) = (void *)imp;
if (setIcon) {
setIcon([UIApplication sharedApplication], selector, iconName, ^(NSError *error) {
if (error != nil) {
NSLog(@"%s line:%d 更改App圖標(biāo)發(fā)生錯(cuò)誤:%@", __func__, __LINE__, error);
} else {
NSLog(@"%s line:%d 更改App圖標(biāo)成功筝尾。", __func__, __LINE__);
}
});
}
}
Swift內(nèi)調(diào)用的話需要橋接一下。
Note:
unsafeBitCast:轉(zhuǎn)換時(shí)會(huì)忽略數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換办桨,不會(huì)因?yàn)閿?shù)據(jù)類型的變化而改變?cè)瓉淼膬?nèi)存數(shù)據(jù)
參考:
iOS動(dòng)態(tài)切換AppIcon
Swift 通過IMP調(diào)用Selector
swift的@convention