从iOS10.3开始,苹果就支持了开发者通过编程来动态改变app的icon。这里简单介绍下如何动态改变app icon。
首先要了解一下三个属性/api:
var supportsAlternateIcons: Bool { get }
var alternateIconName: String? { get }
func setAlternateIconName(String?, completionHandler: ((Error?) -> Void)? = nil)
- supportsAlternateIcons:只读属性,它用来检测app是否支持修改icon。我们需要在info.plist里把它设置为true。
- alternateIconName:只读属性,当前使用的icon名称。
- setAlternateIconName:设置显示的icon,如果值为nil,那么它会显示主icon。
环境准备
把icon的图片放置在项目的目录下(注意:不要把icon的图片放在Assets目录里)
目录示例:pichu.png, pikachu.png 和raichu.png
设置info.plist
设置info.plist内容如下:
- 添加icon文件到Information Property List
- 添加字典CFBundleAlternateIcons
- 在CFBundleAlternateIcons下添加三个字典,对应为:pichu,pikachua和raichu。
- 每个字典添加属性:UIPrerenderedIcon 和 CFBundleIconFiles
配置示例如下:
代码示例
这里假设有三个按钮,点击一个按钮会切换到对应的icon:
// icon变为"pichu"
@IBAction func pichuButtonDidTap(_ sender: UIButton) {
changeIcon(to: "pichu")
}
// icon变为"pikachu"
@IBAction func pikachuButtonDidTap(_ sender: UIButton) {
changeIcon(to: "pikachu")
}
// icon 变为 "raichu"
@IBAction func raichuButtonDidTap(_ sender: UIButton) {
changeIcon(to: "raichu")
}
func changeIcon(to iconName: String) {
guard UIApplication.shared.supportsAlternateIcons else {
return
}
UIApplication.shared.setAlternateIconName(iconName, completionHandler: { (error) in
if let error = error {
print("修改icon失败: \(error.localizedDescription)")
} else {
print("修改icon成功")
}
})
}
这里主要在changeIcon函数里,它概括如下:
- 检查supportsAlternateIcons,判断app是否支持修改icon
- 调用setAlternateIconName,修改app icon
原文:https://medium.com/ios-os-x-development/dynamically-change-the-app-icon-7d4bece820d2