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

时间:2017-02-13 01:23:07

标签: ios swift swift3 icons

我正在尝试在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我有五个图标; 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>

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

如何解决此问题?

2 个答案:

答案 0 :(得分:9)

由于两个原因,我收到了这个错误,

  • 首先,我没有通过向项目添加png文件来“将文件添加到'ProjectNameFoo'”。否则它不起作用。之后它开始看到图标。
  • 其次,我收到此错误是因为我在 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)的图标

用于调试版本(!?),这似乎不起作用。

它不会在发行版本配置中显示此警报,也不会更改图标