ios更改应用图标,修改ios app图标

官方
iOS10.3新增了可以让开发者去更改app的icon,接下来看看怎么更改 。官方API给的东西很少,只是介绍了一个实例方法:
open func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Swift.Void)? = nil)根据传入的参数可知,我们只需要传入备用icon名字即可,然后在回调里面拿到修改的结果,成功的话error为空,不成功则返回相应的错误信息(可以使用error!.localizedDescription来打印查看错误信息) 。如果失败的话 , alternateIconName属性不变 。这里注意:
如果当期app使用的icon是备用的icon,那么这个属性的值就是当前icon的名字 , 这个名字是在Info.plist里面设置的名字,如果当前app展示的是主要(primary)的icon,那么这个值为nil 。这里需要注意两点:
当前设备的系统版本 。这里的所有api都是10.3才能使用的 。
当前app是否支持备用icon 。使用supportsAlertnateIcons属性判断 。只有为true的使用才能去更改 。API中还有一句话比较关键:
你必须在Info.plist里面使用CFBundleIcons声明当前app的primary和alternate icon 。这里如果不了解可以往下看,先忽略 。具体的Info.plist里面的字段含义这里就不在一一说明,详情可了解这里 。
总之官方API上面我只找到了这么多 。然而给我的感觉反倒一脸懵逼,完全搞不懂下面的Info.plist怎么设置 。因此有了下面的序文 。
个人理解
在刚才的Info.plist Key介绍里面 , 我们先看一下其他的小知识 。我们都知道在Info.plist里面有个Bundle display name,也就是设置app在桌面显示的名字 。此时如果我们先不管这个key,我们继续在Info.plist里面添加CFBundleDisplayName , 你会收到这样一个提示:
The key you entered is already present in the dictionary.do you want to replace the existing key/value pair?但是看一下Info.plist字典中的key,并没有CFBundleDisplayName,替换后发现 , 原来它就是Bundle display name 。也就是说,Info.plist里面的Key在Xcode中显示的并不是Key,而是Xcode name 。如下图:

ios更改应用图标,修改ios app图标

文章插图

这个是从官方API上截的图,其实这些Key都有对应的Xcode name,也就是在Xcodes里面我们能看到的key 。其实也很简单,如果你把Info.plist使用源码形式打开(右击—>Open as —>Source code),你就会发现这里写的key就是上面列出来的key 。
先看看我在网上查资料设置的Info.plist:
ios更改应用图标,修改ios app图标

文章插图

这里的CFBundleIconFiles是备用icon的名字 。下面的Primary Icon是默认的icon 。源代码就是:
ios更改应用图标,修改ios app图标

文章插图

其中CFBundleIcons对应的就是Icon files(iOS 5),CFBundleIconFiles就是Primary Icon 。先看一下CFBundleAlternateIcons 。这个CFBundleAlternateIcons key所对应的value在iOS里面是一个字典,例如:
ios更改应用图标,修改ios app图标

文章插图

每个字典的key是备用icon的名字,这个也是你传入到
IApplication.shared.setAlternateIconName(iconName) { (error) in if (error != nil) { self.aler(str: (error!.localizedDescription)) }else { self.aler(str: "修改成功") } }里面的iconName 。其中的字典对应值解释如下:
ios更改应用图标,修改ios app图标

文章插图

CFBundleIconFiles:这个是一个String的数组 , 里面每个元素都是icon 的名字,你可以添加多个不同大小的icon来支持iPhone,iPad 。UIPrerenderedIcon:指定应用程序的图标是否包含闪光效果(shine effect),如果icon已经有这个效果,就把这个属性设置为YES来防止系统再次添加相同效果 。如果设置为NO(默认值),iOS系统会自动添加这个效果 。然而,我并没有测试出来这个效果!!这里还要注意一下:Primary Icon的Item 0的name也可以不填写,苹果官方文档也没有具体说名字这个要怎么去填写,只是说如果你想使用CFBundlePrimaryIcon键值定义的icon,直接使用将setAlternateIconName的参数alternateIconName写成nil就行 。在属性列表里面直接不填写就行(即把AppIcon60x60删掉)