最近公司做一个换皮肤的功能,简单的说就是动态替换项目中的图片、导航栏、颜色什么的;还涉及到替换app的icons。经过调研发现,在iOS10.3版本以前是没有办法替换app的icons(系统不支持也没办法,还是做平台系统的牛叉),iOS10.3版本提供了对应的API:
经过尝试后替换APP的icons需要以下几步:
1.配置Info.plist文件:
大概意思是需要设置CFBundleAlternateIcons,如果想显示最初的icon则设置成nil。具体配置如下:
Primary Icon为默认的icon,只需要将Icon files目录下面的Item0设置成实际项目中icon名称。下面主要介绍CFBundleAlternateIcons设置,如上图所示主要是两个红线画出的地方,这个名称必须和项目中设置的图片名称一样,其他没有什么需要注意的了。下面贴上元数据形式:
<key>CFBundleIcons</key>
<dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>AppIcon</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>CFBundleAlternateIcons</key>
<dict>
<key>APPiconNew60</key>
<dict>
<key>UIPrerenderedIcon</key>
<false/>
<key>CFBundleIconFiles</key>
<array>
<string>APPiconNew60</string>
</array>
</dict>
</dict>
</dict>
2.设置好Info.plist后需要在代码中替换。API中明确指出在使用setAlternateIconName:completionHandler:方法之前需要使用supportsAlternateIcons判断是否支持。废话不说上代码:
dispatch_async(dispatch_get_main_queue(), ^{
if(![UIApplication sharedApplication].supportsAlternateIcons){
return;
}
NSString *iconName = [[UIApplication sharedApplication] alternateIconName];
if(iconName){
[[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) {
}];
}else{
[[UIApplication sharedApplication] setAlternateIconName:@"APPiconNew60" completionHandler:^(NSError * _Nullable error) {
NSLog(@"---error----:%@",error.description);
}];
}
});
当然替换必须在主线程中进行。
替换成功后界面弹出提示,下面是项目中替换成功后弹出框: