我正在尝试在iOS 10.3
中为我的应用设置备用图标,但每次调用方法时Xcode都会返回:
错误Domain = NSCocoaErrorDomain Code = 3072“操作已取消。”
我在@KlimczakM帖子中使用this的回答来设置图标(下面调用的specifyIcon
方法),但我使用自己的方法从设置中加载首选图标:
let iconSetting = userDefaults.string(forKey: "appIconSetting")
print("The icon setting is: \(iconSetting ?? "error getting appIconSetting.")")
switch iconSetting! {
case "white":
specifyIcon(nil)
case "dark":
specifyIcon("dark")
case "text":
specifyIcon("text")
case "textdark":
specifyIcon("textdark")
case "rainbow":
specifyIcon("rainbow")
default:
specifyIcon(nil)
print("ERROR setting icon.")
}
func specifyIcon(_ icon: String?) {
//(@KlimczakM's answer)
}
在我Info.plist
我有五个图标; white
,dark
,rainbow
,text
和textdark
:
<key>CFBundleIcons</key>
<dict>
<key>CFBundleAlternateIcons</key>
<dict>
<key>white</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>ic_white</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>dark</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>ic_dark</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>rainbow</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>rainbow</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>text</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>ic_text</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>textdark</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>ic_textdark</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
</dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>ic_white</string>
</array>
</dict>
</dict>
所有这些图标都包含在我的应用包内名为“resources”的文件夹中的PNG文件中。
如何解决此问题?
答案 0 :(得分:9)
由于两个原因,我收到了这个错误,
其次,我收到此错误是因为我在 viewDidLoad 之后尝试更改图标。我不是为什么,但它给了我同样的错误。当我像下面的代码一样延迟尝试时,无论我给出的是什么,它都在工作。
override func viewDidLoad() {
super.viewDidLoad()
delay(0.01) {
if foo().isFoo() {
print("")
self.changeIcon(name: "ColdRabbit")
}
else {
print("")
}
}
}
func delay(_ delay:Double, closure:@escaping ()->()) {
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
答案 1 :(得分:1)
我被这个错误困扰了很长时间,尝试了各种各样的方法,但是无法弄清我做错了什么。我正在从AppDelegate.application(didFinishLaunchingWithOptions:)
更改图标。如上所述,使用计时器延迟呼叫确实可以解决该问题。
值得注意的是,此问题是由于UIKit试图在消息中显示UIAlertController
您已更改$(PRODUCT_NAME)的图标
用于调试版本(!?),这似乎不起作用。
它不会在发行版本配置中显示此警报,也不会更改图标。