ios图标: 改变 iOS app 的 icon(iOS10.3)

Jessica 坐标: 108733 目录:婚姻家庭

自己实现需要注意两个问题:

首先来设置 Info.plist。

按照苹果官方的 API 说法,那就先在 Info.plist 里面添加 CFBundleIcons。但是查看了一下 Key 和 Xcode name 对应的表格,CFBundleIcons 对应的是 None,那就直接添加 CFBundleIcons 吧。点 Information Property List 后面的加号,输入 CFBundleIcons,当点击 Enter 键的时候,你会惊奇发现:你添加的 CFBundleIcons 变成了 Icon files ( iOS 5 ) 字典。看看 CFBundleIcons 的官方 API:

根据英文意思可以知道:该 key 包含了所有 app 使用的 icons 信息。新建的是这样的:

可知默认的包含了 CFBundlePrimaryIcon 和 UINewsstandIcon。里面没有 CFBundleAlternateIcons, ( 我理解的应该是苹果不太想支持用户添加备选 icon,所以才没有 ) 。这里不过多介绍 UINewsstandIcon 了,它应该是在 NewStand 上展示的吧,不太清楚,想了解可以看 API,里面介绍了。

现在把 NewStand Icon 删除,添加 CFBundleAlternateIcons。添加后如图所示:

但是看官方 API 对 CFBundleAlternateIcon 的介绍里面,并没有 UINewstandBindingType 和 UINewsstandBindingEdge,只有这个:

也就是官网所说的只有 CFBundleIconFiles 和 UIPrerenderedIcon,那就删了多余的那两个 UINewstandBindingType 和 UINewsstandBindingEdge。然后添加 UIPrerenderedIcon:

。按照苹果的说法,把备用图标的名字放到 Items0 里面。我们先直接在左侧导航中加入两张图片:newicon@2x.png 和 newicon@3x.png,一个 120 120,一个 180 180。

但是看到上图说的设置,跑起来运行代码:

@IBAction func changeToNewIconAction ( _ sender: Any ) { if !checkSupportChangeIcon ( ) { return } if !UIApplication.shared.supportsAlternateIcons { return } changeToIcon ( "newicon" ) }//MARK: check system versionfunc checkSupportChangeIcon ( ) -> Bool { let deviceVersion = UIDevice.current.systemVersion if deviceVersion.contains ( "10.3" ) { return true } return false}//MARK: change to icon messagefunc changeToIcon ( _ iconName: String? ) { UIApplication.shared.setAlternateIconName ( iconName ) { ( error ) in if ( error != nil ) { self.aler ( str: ( error!.localizedDescription ) ) }else { self.aler ( str: " 修改成功 " ) } } }//MARK: alert messagefunc aler ( str: String ) { let alert = UIAlertController.init ( title: " 提示 ", message: str, preferredStyle: .alert ) let okAction = UIAlertAction.init ( title: "ok", style: .cancel ) { ( action: UIAlertAction ) in print ( " 关闭弹出框 " ) } alert.addAction ( okAction ) self.present ( alert, animated: true, completion: nil ) }

结果却是:

The file doesn"t exist

看了一下官方 API 对 CFBundleAlternateIcons 的介绍,里面有一句话:

In iOS, the value of the key is a dictionary. The key for each dictionary entry is the name of the alternate icon, which is also the string you pass to the setAlternateIconName:completionHandler: method of UIApplication when changing icons. The value for each key is a dictionary containing the keys in Table 5

意思是这个 CFBundleAlternateIcons 中的字典的 key 是备用 icon 的名字,因此需要这样修改:

也就是 CFBundleAlternateIcons 字典里面的 key 是备用 icon 的名字,然后以名字为 key 的字典里面又包含了 CFBundleIconFiles 和 UIPrerenderedIcon。

这样设置之后再次运行你会发现成功更改了 icon。

这样就成功地改变了 icon。

关于 Primary Icon,直接不用设置 Icon files 就好了,如果你想设置为默认的 icon,就在 setAlternateIconName 里面传入 nil 就好了。这个时候 Info.plist 源码长这样:

在 Property List 里面,Primary Icon 的 Icon already includes gloss effects 就是 UIPrerenderedIcon,它的设置为 false。 ( 这里的光泽效果也是没有测试出来有什么不一样 )

接下来看看备用 icon 是在哪里放着呢?

开始的时候直接放到这里:

发现是 OK 的,可以正常显示。

那么放到 Assets.xcassets 里面呢?放到 Bundle 里面呢?接下来将每个 case 都进行测试:

放到 Assets.xcassets 里面。新建一个普通的 Image set,然后将图片放到里面,效果如图所示:

经过测试发现,这样放置是无法正常改变 appicon 的。但是运行结果没有任何错误,而且系统提示里面加载的也是新的 app icon:

放到 Assets.xcassets 里面,并且新建的 icon,如图:

运行依然设置不成功。没有错误提示

放到一个新建的 Bundle 里面。如图所示:。

运行结果依然是没有成功更改。没有错误提示。

所以经过测试,发现只有放到导航里面的图片才可以更改成功。在苹果 qa 里面看到过一个场景,他们是直接在导航新建了一个文件夹,然后将图片放到里面,然后使用。这里也推荐建立文件夹放入图片,然后使用

另外,关于 icon 大小,可以参见这里。

最后告诉大家一个不使用 Asset 来配置 Icon 的方法:直接在 Info.plist 下面这样写:

这个是通用的,可以直接设置 iPhone 和 iPad 的 icon。其实这里也是想告诉大家:如何在 CFBundleIconFiles 里面去添加图片数组:

CFBundleIconFiles Icon-Small Icon-Small-40 Icon-Small-50 Icon Icon-60 Icon-72

专题栏目
最新