Code=3072 "The operation was cancelled" 设置备用应用程序图标时

Code=3072 "The operation was cancelled" when setting alternate app icon

我正在尝试在我的 iOS 应用程序中设置一个名为 MyIconalternate app icon。我的项目包中有一个 MyIcon.png 图像(不在我的资产文件夹中),它在我的 Info.plist 中声明如下:

<key>CFBundleIcons</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>MyIcon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>MyIcon</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
    </dict>
</dict>

在我的代码中,我尝试更改应用程序图标:

UIApplication.shared.setAlternateIconName("MyIcon")

但是,图标没有改变,而是在控制台中给出了这个错误:

Error Domain=NSCocoaErrorDomain Code=3072 "The operation was cancelled."

我该如何解决这个问题?

我收到这个错误有两个原因,

  • 首先(当然不是因为),我没有通过将 png 文件添加到项目来执行 “将文件添加到 'ProjectNameFoo'”。否则它不起作用。之后它开始看到图标。
  • 其次(也是极有可能的原因),我收到此错误是因为我试图更改 viewDidLoad 中的图标。当我像下面的代码那样尝试延迟时,它在我给出的任何时间都在工作。
override func viewDidLoad() {
    super.viewDidLoad()

    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        UIApplication.shared.setAlternateIconName("MyIcon")
    }
}

我被这个错误困扰了很长一段时间,尝试了各种方法,但无法弄清楚我做错了什么。我正在更改 AppDelegate.application(didFinishLaunchingWithOptions:) 中的图标。按照上面的建议用计时器延迟通话确实解决了这个问题。

值得注意的是,这个问题是由于 UIKit 试图显示 UIAlertController 和消息

You have changed the icon for $(PRODUCT_NAME)

那时候似乎不起作用。您需要等到加载根视图控制器。

这是因为这个API并不是让开发者随意更新图标,而是让用户自己选择一个交付能力。