iOS10.3 更换应用图标

iOS 10.3 新增了更换 App 图标的功能,这个功能使用起来也不复杂,这篇文章就介绍一下 iOS 10.3 怎么更换 App 的图标

官方文档介绍

更换图标的需要用到下面几个新 API 方法:

1
2
3
4
5
6
7
8
9
10
11
// 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?) -> Swift.Void)? = nil)
// If `nil`, the primary application icon is being used.
@available(iOS 10.3, *)
open var alternateIconName: String? { get }

其中最主要的是 setAlternateIconName 方法,这是这个方法的官方文档 除了使用这个方法之外还需要在 info.plist 文件里配置,这是配置说明 具体配置如图:

  • Primary Icon:主要图标
    • Icon files:图标数组
    • Icon already includes gloss effects:图标已经包括光亮效果
  • CFBundleAlternateIcons:包含有关应用程序所使用的所有图标的信息,此键允许您根据其预期的使用组合图标,并指定多个图标文件,并使用特定的键来修改这些图标的外观(当有多个备选图标时,在该数组下面增加多个Dictionary)
    • NoImagePlac(Dictionary):图标字典,以图片名称作为字典名,setalternateiconname 方法里面传入的图片名字就是和这个名字一致才能修改图标
      • CFBundleIconFiles:用于指定捆绑图标图像文件的文件名的顶级键
      • UIPrerenderedIcon:图标文件是否已包含光亮效果,如果有了,苹果就不会给你加光亮效果(不设置或者为NO时会给你加上闪烁效果)

具体实现

上面的配置完成之后,就开始具体的实现了:

  1. App 默认的图标还是和之前一样放到 Assets.xcassets 里面
  2. 依照上面的 Info.plist 来配置 CFBundleAlternateIcons,用来切换图标的图片必须放在工程里面,放在 Assets.xcassets 里面是没有效果的
  3. 使用代码进行切换

这是代码实现:

func changeIcon(iconName:String?) {
    if UIApplication.shared.supportsAlternateIcons {//判断设备是否支持更换图标      
        UIApplication.shared.setAlternateIconName(iconName, completionHandler: { (error) in
            if error != nil {
                 print("替换icon失败\(String(describing: error?.localizedDescription))")
            }
        })
    }else {
        print("设备不支持更换图标")
    }
}

更换图标的时候会弹出提示框,提示框左边会显示更换的图标的样子,选择确定之后,回到桌面就可以看到图标被修改了

如果需要恢复原来的图标 setAlternateIconNamenil 就可以恢复了

这是 demo 代码地址

本人刚开始写博客,主要是为了给自己的知识点做一个笔记,方便自己以后查阅,如果能让别人有所启发也是荣幸之至!如有错误,欢迎指正!