App更换图标

App更换图标

京东淘宝的每到618或者双十一的时候,app图标都会贴合相关主题更换一下,但是那个时间段app也没有升级,所以说肯定是有一个配置能够更改app的图标。

查了一些文档,发现了如下的方法。

准备图片

准备120x120和180x180两种尺寸的图。分别命名为[email protected][email protected]

然后把图片放置到项目的一个目录下,注意不是放到 image assets里边

修改Info.plist

打开项目的Info.plist,在文件上右键,open as source code,添加如下代码

<key>CFBundleIconskey>
<dict>
    <key>CFBundleAlternateIconskey>
    <dict>
        <key>NewAppIconkey> // 这个是函数需要用到的参数
        <dict>
            <key>CFBundleIconFileskey>
            <array>
                <string>iconstring> // 这个地方的icon就是文件名
            array>
            <key>UIPrerenderedIconkey>
            <false/>
        dict>
    dict>
dict>

添加修改图标函数

添加如下代码进行更新。

if UIApplication.shared.supportsAlternateIcons {
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        UIApplication.shared.setAlternateIconName("NewAppIcon") { error in
            if let error = error {
                print(error.localizedDescription)
            } else {
                print("Success!")
            }
        }
    }
}

更新完成之后会发现弹出来了一个提示窗,这样体验就不太好了。因此需要稍微修改一下。
增加一下方法。

func setApplicationIconName(_ iconName: String?) {
    if UIApplication.shared.responds(to: #selector(getter: UIApplication.supportsAlternateIcons)) && UIApplication.shared.supportsAlternateIcons {
        
        typealias setAlternateIconName = @convention(c) (NSObject, Selector, NSString?, @escaping (NSError) -> ()) -> ()
        
        let selectorString = "_setAlternateIconName:completionHandler:"
        
        let selector = NSSelectorFromString(selectorString)
        let imp = UIApplication.shared.method(for: selector)
        let method = unsafeBitCast(imp, to: setAlternateIconName.self)
        method(UIApplication.shared, selector, iconName as NSString?, { _ in })
    }
}

之后调用的时候使用以上方法。

if UIApplication.shared.supportsAlternateIcons {
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        self.setApplicationIconName(nil)
    }
}

这样就能默默的换icon了。

你可能感兴趣的:(iOS开发,ios,objective-c,xcode)