设置备用应用程序图标返回错误3072:在iOS 10.3中“操作已取消”

我试图在iOS 10.3设置我的应用程序的替代图标,但每次我调用Xcode返回的方法:

错误域= NSCocoaErrorDomain代码= 3072“操作被取消。”

我正在使用@KlimczakM从这个post的答案来设置图标(下面指定的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我有五个图标; whitedarkrainbowtexttextdark

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

所有这些图标作为PNG文件包含在我的应用程序包内的一个名为“resources”的文件夹中。

我该如何解决这个问题?

我得到这个错误是因为两个原因,

  • 首先,我没有做“添加文件到'ProjectNameFoo'”通过添加PNG文件项目。 否则,它不工作。 之后,它开始看到图标。
  • 其次,我得到这个错误,因为我想在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) }