【iOS】iOS动态更换应用图标

导读:
最常见的便是活动来临之前,我们能够常常看到各大电商渠道的使用图标在没有使用更新的时候就主动替换了图标,其实这个就触及到了动态替换使用图标的功用。此处记载一下开发过程中遇到的一个使用动态替换使用图标的问题。

iOS15之前

在 iOS15 之前,实际上 iOS 现已支持了动态替换使用图标的功用,其核心点便是经过手动配置 info.plist 文件,确保切换图标能够经过对应的 info.plist 文件进行查询,一起需求在使用对应的资源文件中放入需求切换的图标资源才能够。全体流程相对来讲比较费事。

【iOS】iOS动态更换应用图标

此处使用图标增加的有 20、29、40、60、76、83.5 六种,实际上可能不需求这么多,仅仅为了保持和在 Assets -> AppIcon 图标尽量共同而已,且此处是包括 iPhone 和 iPad 的图标的。

其中 iPhone 对应的图标是 20、29、40、60 四种;iPad 对应的图标是 29、40、60、76、83.5 五种。

当增加完资源图标后,需求在 info.plist 文件中开始配置相应参数,以确保在切换图标时能够查找的到。

【iOS】iOS动态更换应用图标

/// info.plist 文件
<key>CFBundleIcons</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>AppIcon_52B9EB</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>AppIcon_52B9EB_20</string>
                <string>AppIcon_52B9EB_29</string>
                <string>AppIcon_52B9EB_40</string>
                <string>AppIcon_52B9EB_60</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
        <key>AppIcon_5AC36E</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>AppIcon_5AC36E_20</string>
                <string>AppIcon_5AC36E_29</string>
                <string>AppIcon_5AC36E_40</string>
                <string>AppIcon_5AC36E_60</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
    </dict>
</dict>
<key>CFBundleIcons~ipad</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>AppIcon_52B9EB</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>AppIcon_52B9EB_29</string>
                <string>AppIcon_52B9EB_40</string>
                <string>AppIcon_52B9EB_60</string>
                <string>AppIcon_52B9EB_76</string>
                <string>AppIcon_52B9EB_83.5</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
        <key>AppIcon_5AC36E</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>AppIcon_5AC36E_29</string>
                <string>AppIcon_5AC36E_40</string>
                <string>AppIcon_5AC36E_60</string>
                <string>AppIcon_5AC36E_76</string>
                <string>AppIcon_5AC36E_83.5</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
    </dict>
</dict>

阐明一下:

  • CFBundleIconsCFBundleIcons~ipad 分别是对应的 iPhone 和 iPad 的图标替换适配;
  • CFBundleAlternateIcons 的 value 值是以键值对方法存在的字典,每一个 key 便是对应的图标称号,到时候便是根据这个称号去查找图片资源的;
  • 比方 AppIcon_52B9EB 便是对应的图标资源称号;
  • 图标不能有圆角、透明度,不能有 alpha 通道。

iOS15及之后

iOS15 及之后,Apple 官方为了便利替换使用图标,以应对更加灵活的商场,对动态替换使用图标功用做了一些调整。而该方法的原理实际上便是将之前经过 info.plist 的获取图标的方法,经过 Include All App Icon AssetsAssets 中的使用图标集主动增加到 info.plist 中,便利读取。

iOS15及之后,只需求经过 Assets -> + -> iOS -> iOS App Icon 的方法新建一个 AppIcon 图标集,并自定义称号。

【iOS】iOS动态更换应用图标

再之后,经过 项目工程 -> TARGETS -> Build Settings -> 搜索 Include All App Icon Assets,并将其参数值更改为 YES 即可。

【iOS】iOS动态更换应用图标

另外此种方法需求经过苹果官方审阅才能在线上使用,届时能够经过 App Store Connect 后台管理网站进行切换使用图标。

(因为需求兼容 iOS15 以下的系统,所以此种方法并未进行线上审阅测验,仅仅进行了本地代码测验)

代码测验

/// 获取当时一切的 AppIcon 集
if let iconsDict = Bundle.main.object(forInfoDictionaryKey: "CFBundleIcons") as? [String:Any] {
    if let alternateIcons = iconsDict["CFBundleAlternateIcons"] as? [String:Any] {
        debugPrint(alternateIcons.keys)
        alternateIcons.keys.forEach { item in
            debugPrint(item)
        }
    }
}
/// 替换使用图标
UIApplication.shared.setAlternateIconName(iconName) { error in
    if error != nil {
        HUD.flashFailure("替换使用图标失利\n\(String(describing: error?.localizedDescription))")
    }
}
/// 康复默认使用图标
UIApplication.shared.setAlternateIconName(nil, completionHandler: nil)

假如替换成功会有如下弹框款式:

【iOS】iOS动态更换应用图标

参阅链接

  • – Ztfiso – iOS15 切换上架App图标的最新计划
  • – 邓小胖先生 – iOS动态切换AppIcon

版权声明

原文作者:苜蓿鬼仙(苜蓿、jijiucheng)

原文链接:GitHub.io – 苜蓿鬼仙 – 【iOS】iOS动态替换使用图标

宣布日期:2022/08/17 17:00:00

更新日期:2022/08/17 17:00:00

GitHub:GitHub – jijiucheng

个人博客:GitHub.io – 苜蓿鬼仙

小专栏:小专栏 – 苜蓿鬼仙

: – 苜蓿鬼仙

微博:微博 – 苜蓿鬼仙

大众号微信 – 苜蓿小站

小程序:微信 – 苜蓿小站