美文网首页iOS 实用技术iOS开发技巧iOS10以后的新技术
【iOS 开发】iOS 10.3 如何更换 app 图标

【iOS 开发】iOS 10.3 如何更换 app 图标

作者: KyXu | 来源:发表于2017-03-30 01:22 被阅读2736次

    iOS 10.3 开放了更换 app 图标的 API,核心方法是下面这个:

    func setAlternateIconName(_ alternateIconName: String?, 
        completionHandler: ((Error?) -> Void)? = nil)
    

    这是官方文档,但是你还需要在 info.plist 里面填一些东西才能让它起作用,这部分官方注释内容在这里

    但 info.plist 如何填写这部分读起来还是有些晦涩,一时可能搞不清楚如何操作,下面做个示范。

    Assets.xcassets
    info.plist
    <key>CFBundleIcons</key>
    <dict>
        <key>CFBundleAlternateIcons</key>
        <dict>
            <key>blackBgColor</key>
            <dict>
                <key>CFBundleIconFiles</key>
                <array>
                    <string>blackBgColor</string>
                </array>
                <key>UIPrerenderedIcon</key>
                <false/>
            </dict>
        </dict>
        <key>CFBundlePrimaryIcon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>AppIcon60x60</string>
            </array>
        </dict>
    </dict>
    

    如图,<code>Primary Icon</code> 字段写为 <code>AppIcon60x60</code> 是因为这里 xcassets 里面我只导入了 60pt@2x 和 60pt@3x 的图片资源,这里选为 60 是因为对于 iPhone,60pt 的图片资源图标所需最高质量,更低分辨率的版本系统会自动压缩以展示。

    <code>blackBgColor</code> 是我的用于替换原生图标的图片资源。文件名需要和 info.plist 中保持一致(注意 info.plist 中用到了两次 "blackBgColor"),同时这也是你在代码中设置图标时,需要给 API 传入的参数。同样是 60pt@2x 和 60pt@3x 的图片资源,文件不通过 Assets.xcassets 添加进来,而是直接放到目录中。

    如果你需要支持 iPad,建议这里使用 83.5pt(iPad Pro)的图片资源。另外还有些其他关于在 iPad 上替换图标的注意事项,在这里有说明,注意我们这里在 info.plist 里面所用的 key 是<code> CFBundleIcons</code>,还有另外一个 key 是 <code>CFBundleIcons~ipad</code>。

    替换图标部分的代码就超级简单了:

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        @IBAction func changeAppIcon(_ sender: Any) {
            
            if UIApplication.shared.supportsAlternateIcons {
                print("you can change this app's icon")
            }else {
                print("you cannot change this app's icon")
                return
            }
            
            if let name = UIApplication.shared.alternateIconName {
                // CHANGE TO PRIMARY ICON
                UIApplication.shared.setAlternateIconName(nil) { (err:Error?) in
                    print("set icon error:\(String(describing: err))")
                }
                print("the alternate icon's name is \(name)")
            }else {
                // CHANGE TO ALTERNATE ICON
                UIApplication.shared.setAlternateIconName("blackBgColor") { (err:Error?) in
                    print("set icon error:\(String(describing: err))")
                }
            }
        }
    
    }
    

    这是上述所有内容的完整 demo 地址

    screentshot

    相关文章

      网友评论

      • 青衫_客:ios苹果手机被锁定了,id密码忘记了,邮箱又不能使了怎么办呢!
        霜白露:砸了
      • 阿吖嗄:关注一下:+1:
      • ZhongXi:总感觉这种实现方法怪怪的..
      • 心语风尚:可以只换图标不弹框不
      • 子达如何:这个功能怎么看都是主管没审核好,把实习的印度人写的代码公开了。
        1. 都已经不用plist指定icon的时代了,这个API却要从plist里指定
        2. 都已经用Image asset的时代了,这个API却要把图标直接加到项目才行
        3. 调用这个API竟然还有内部的Alert提示,提示的格式完全没有美感,提示的文字也是莫名其妙。
        心语风尚:@你爱我呗 ReplayKit屏幕录制 可以后台录制 主屏幕菜单界面吗 就是全局录制 按home键 到主屏幕 也可以录制主屏幕吗
        mapg:@心语风尚
        1. 都已经不用plist指定icon的时代了,这个API却要从plist里指定
        2. 都已经用Image asset的时代了,这个API却要把图标直接加到项目才行
        这两个确实蛋疼?
        3. 调用这个API竟然还有内部的Alert提示,提示的格式完全没有美感,提示的文字也是莫名其妙。
        切换图标弹出一个提示怎么就感觉别扭
        心语风尚:什么啊,是苹果官方api alert样式 图标正常是不能设定的 但可以通过KVC该alert的样式私有方法加图标 该字体
      • 疯狂的IT人:视乎只能改为预先设置好的啊,不能从网上下载一个然后设置?
        KyXu:@疯狂的IT人 还没试过,理论上没问题,只要你的图片名存在于info.plist的相应位置就行
      • iCode_:啥意思?就是不用更新版本也可以改变icon吗?
        KyXu:@淡漠烟薰 对

      本文标题:【iOS 开发】iOS 10.3 如何更换 app 图标

      本文链接:https://www.haomeiwen.com/subject/dvquottx.html