美文网首页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