iOS 10.3 開放了更換 app 圖示的 API,核心方法是下面這個:
func setAlternateIconName(_ alternateIconName: String?,
completionHandler: ((Error?) -> Void)? = nil)複製程式碼
這是官方文件,但是你還需要在 info.plist 裡面填一些東西才能讓它起作用,這部分官方註釋內容在這裡。
但 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))")
}
}
}
}複製程式碼