iOS动态改变App Icon

时间:2022-06-01 16:54:51

从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

iOS动态改变App Icon

设置info.plist

设置info.plist内容如下:

  1. 添加icon文件到Information Property List
  2. 添加字典CFBundleAlternateIcons
  3. 在CFBundleAlternateIcons下添加三个字典,对应为:pichu,pikachua和raichu。
  4. 每个字典添加属性:UIPrerenderedIcon 和 CFBundleIconFiles

配置示例如下:
iOS动态改变App Icon

代码示例

这里假设有三个按钮,点击一个按钮会切换到对应的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函数里,它概括如下:

  1. 检查supportsAlternateIcons,判断app是否支持修改icon
  2. 调用setAlternateIconName,修改app icon

原文:https://medium.com/ios-os-x-development/dynamically-change-the-app-icon-7d4bece820d2