iOS 10.3 如何更換 app 圖示

KyXu發表於2017-03-29

iOS 10.3 開放了更換 app 圖示的 API,核心方法是下面這個:

func setAlternateIconName(_ alternateIconName: String?, 
    completionHandler: ((Error?) -> Void)? = nil)複製程式碼

這是官方文件,但是你還需要在 info.plist 裡面填一些東西才能讓它起作用,這部分官方註釋內容在這裡

iOS 10.3 如何更換 app 圖示

但 info.plist 如何填寫這部分讀起來還是有些晦澀,一時可能搞不清楚如何操作,下面做個示範。

iOS 10.3 如何更換 app 圖示
Assets.xcassets

iOS 10.3 如何更換 app 圖示
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>複製程式碼

如圖,Primary Icon 欄位寫為 AppIcon60x60 是因為這裡 xcassets 裡面我只匯入了 60pt@2x 和 60pt@3x 的圖片資源,這裡選為 60 是因為對於 iPhone,60pt 的圖片資源圖示所需最高質量,更低解析度的版本系統會自動壓縮以展示。

blackBgColor 是我的用於替換原生圖示的圖片資源。檔名需要和 info.plist 中保持一致(注意 info.plist 中用到了兩次 "blackBgColor"),同時這也是你在程式碼中設定圖示時,需要給 API 傳入的引數。同樣是 60pt@2x 和 60pt@3x 的圖片資源,檔案不通過 Assets.xcassets 新增進來,而是直接放到目錄中。

如果你需要支援 iPad,建議這裡使用 83.5pt(iPad Pro)的圖片資源。另外還有些其他關於在 iPad 上替換圖示的注意事項,在這裡有說明,注意我們這裡在 info.plist 裡面所用的 key 是 CFBundleIcons,還有另外一個 key 是 CFBundleIcons~ipad

替換圖示部分的程式碼就超級簡單了:

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 地址

iOS 10.3 如何更換 app 圖示
screentshot0

iOS 10.3 如何更換 app 圖示
screentshot1

相關文章