在iOS 10.3之后,苹果官方提供了相关的API来实现这个功能,主要是下面这几个方法:
API
extension UIApplication {
// If false, alternate icons are not supported for the current process.
@available(iOS 10.3, *)
open var supportsAlternateIcons: Bool { get }
// Pass `nil` to use the primary application icon. The completion handler will be invoked asynchronously on an arbitrary background queue; be sure to dispatch back to the main queue before doing any further UI work.
@available(iOS 10.3, *)
open func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Void)? = nil)
// If `nil`, the primary application icon is being used.
@available(iOS 10.3, *)
open var alternateIconName: String? { get }
}
方法很简单,但是使用之前需要进行一些配置:
第一步:配置icon
添加图片icon
动态修改的icon不能放在 Assets.xcassets 里,但是正常的主icon还是可以在这里设置的,也可以按下面的方法来设置;
首先,把需要修改的icon放在一个文件夹内:

也可以把需要的logo文件全部放进去
第二步:配置info.plist
在info.plist中右键 -> Add Row :
输入Icon... 会有提示,选择Icon files(iOS 5)

//这里的Icon files(iOS 5)是个字典,其中可包含的Key值有
CFBundlePrimaryIcon -> Primary Icon
CFBundleAlternateIcons
UINewsstandIcon -> Newsstand Icon
这里的Primary Icon是设置app的主icon,可以在这里的Icon files数组内添加,有多个的话,依次添加,也可以这里不用填写,直接在Assets.xcassets 里配置;
下面的Newsstand Icon,暂时用不到,不用管,也可以删除。
在 Icon files(iOS 5)内添加一个Key: CFBundleAlternateIcons ,类型为字典,在这个字典里配置我们所有需要动态修改的icon:键为icon的名称,值为一个字典(这个字典里包含两个键:CFBundleIconFiles,其值类型为Array,内容为icon的名称;UIPrerenderedIcon,其值类型为bool,内容为NO,也可以不加此key)

这里的CFBundleIconFiles里面可以放多个尺寸的文件
第三步:编写代码
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
changeLogo(name: "rain")
}
func changeLogo(name:String) -> Void {
if #available(iOS 10.3, *) {
if UIApplication.shared.supportsAlternateIcons {
UIApplication.shared.setAlternateIconName(name) { (error) in
if (error != nil) {
print("失败")
} else {
print("成功")
}
}
}
} else {
// Fallback on earlier versions
}
}
这样每次更换会有一个提示框,如下

网友评论