更改iPad的备用图标

时间:2018-08-21 13:08:20

标签: ios iphone swift xcode ipad

我在iPad上更改应用程序图标时遇到问题。在iPhone上一切正常,但在iPad上我收到此错误:

  

[默认]未能为以下用户将PreferredIconName设置为AI-Gorgosaurus   ...:0>错误:错误   Domain = NSCocoaErrorDomain代码= 4“该文件不存在。”   UserInfo = {NSUnderlyingError = 0x600000248a30 {Error   Domain = LSApplicationWorkspaceErrorDomain代码= -105“未找到iconName   在CFBundleAlternateIcons条目中”   在以下位置找不到UserInfo = {NSLocalizedDescription = iconName   CFBundleAlternateIcons条目}}}应用图标失败,原因是该文件   不存在。

我搜索的广告发现我需要在~ipad中添加CFBundleIconFiles,但仍然会收到相同的错误!。

代码如下:

  func changeIcon(to name: String?) {
        //Check if the app supports alternating icons
        guard UIApplication.shared.supportsAlternateIcons else {
            return;
        }

        //Change the icon to a specific image with given name
        UIApplication.shared.setAlternateIconName(name) { (error) in
            //After app icon changed, print our error or success message
            if let error = error {
                print("App icon failed to due to \(error.localizedDescription)")
            } else {
                print("App icon changed successfully.")
            }
        }
    }

enter image description here

我刚刚在另一个项目上进行了测试,效果很好!但是为什么不在我当前的项目上呢?你有什么主意吗

6 个答案:

答案 0 :(得分:6)

尝试提供此答案的更多可重用(易于复制/粘贴)版本。

1)您需要将以下名称和大小的图像添加为常规.png文件(无资产目录)

.../AppIcon-Dark/iPad-app.png
  pixelWidth: 76
.../AppIcon-Dark/iPad-app@2x.png
  pixelWidth: 152
.../AppIcon-Dark/iPad-pro@2x.png
  pixelWidth: 167
.../AppIcon-Dark/iPhone-app@2x.png
  pixelWidth: 120
.../AppIcon-Dark/iPhone-app@3x.png
  pixelWidth: 180

然后您可以在info.plist中添加/插入以下内容

<key>CFBundleIcons</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>AppIcon-Dark</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>iPhone-app</string>
            </array>
        </dict>
    </dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string>AppIcon</string>
        </array>
    </dict>
</dict>
<key>CFBundleIcons~ipad</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>AppIcon-Dark</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>iPad-app</string>
                <string>iPad-pro</string>
            </array>
        </dict>
    </dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string>AppIcon</string>
        </array>
    </dict>
</dict>

然后我将图标设置为以下

func updateIcon() {
    if #available(iOS 13.0, *) {
        let dark = window?.traitCollection.userInterfaceStyle == .dark

        let currentIconName = UIApplication.shared.alternateIconName
        let desiredIconName:String? = dark ? "AppIcon-Dark" : nil

        if currentIconName != desiredIconName {
            UIApplication.shared.setAlternateIconName(desiredIconName) {
                (error) in
                print("failed: \(String(describing: error))")
            }
        }
    }
}

答案 1 :(得分:4)

您的info.plist的结构不正确。

您有:

<DataGrid x:Name="DataGrid_Messages" Grid.Row="2" AutoGenerateColumns="True"/>

但是应该是:

- CFBundleIcons
  - CFBundleAlternateIcons
    - Icon Name
      - CFBundleFilesIcons
      - CFBundleFilesIcons~ipad

基本上,一旦您将其与iPhone图标- CFBundleIcons - CFBundleAlternateIcons - Icon Name - CFBundleFilesIcons - CFBundleIcons~ipad - CFBundleAlternateIcons - Icon Name - CFBundleFilesIcons 配合使用,就将整个树复制为CFBundleIcons。 iPad文件根本不应嵌套在CFBundleIcons~ipad下。

您正在混合使用CFBundleIconsCFBundleIcons~ipad(这不是有效的密钥)。

Screenshot

答案 2 :(得分:2)

请对您的plist文件进行这些更改,以便为iPhone和iPad设置备用图标。

enter image description here

答案 3 :(得分:1)

具有以下结构,我可以更改iPad中的图标:

    if #available(iOS 10.3, *) {
        let newAppIconName = "Icon2"

        guard UIApplication.shared.alternateIconName != newAppIconName else { return }

        UIApplication.shared.setAlternateIconName(newAppIconName)
    }
}

列表代码:

<key>CFBundleIcons</key>
<dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string>AppIcon</string>
        </array>
        <key>UIPrerenderedIcon</key>
        <true/>
    </dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>Icon2</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>icon60</string>
            </array>
            <key>CFBundleIcons~ipad</key>
            <array>
                <string>iTunesArtwork80.png</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <true/>
        </dict>
    </dict>
</dict>

enter image description here

答案 4 :(得分:1)

我注意到您的plist有 UIPrerenderedIcon设置为NO

将其更改为是

问题可能出在渲染上

编辑1:添加.png扩展名以查看是否有帮助

编辑2:尝试将新图标的文件名更改为ipadAlternate.png。然后在plist中更改为相同的名称,因为它看起来与您的plist和图标文件本身不匹配

编辑3:是否清理了DerivedData文件夹?不久前,我遇到了一个问题,没有任何帮助,包括清理项目等。但是,我尝试删除/ Users / YOURUSERNAME / Library / Developer / Xcode / DerivedData /文件夹中的所有内容,然后它又开始工作。值得一试。

编辑4:尝试从编辑3开始执行步骤。然后重新启动项目,并从中删除所有替代图标文件。选择移至垃圾桶,然后选择CMD + SHIFT + K进行清洁。然后选择CMD + B进行构建。接下来,将图标添加回原来的位置。检查是否正确选择了目标,并在需要选择时复制项目。由于某种原因,Xcode丢失了对文件的跟踪,并且显示了错误,没有文件。

如果这样做没有帮助,请尝试上述步骤。但是首先尝试将整个项目移到另一个文件夹。

编辑5:还有一个您可以自己尝试的想法。尝试删除当前项目中的plist文件(在删除之前保留它的备份副本),然后启动一个新项目,在该项目中,图标更改可以正常进行。将来自该项目的plist添加到该项目中。检查图标更改是否有效。如果是,则添加上一个项目中所有缺少的键。

警告:这是不得已的方法,但是可能会起作用。开始一个新项目,并使用您要交替显示的图标进行设置。首先检查它们是否起作用,然后在不起作用的项目中添加所有代码和依赖项。只是不要覆盖PLIST文件。

编辑6:尝试从模拟器或尝试使用的设备中删除该应用,然后重新安装。整个问题可能与应用程序的更新和上一版本的剩余内容有关。

编辑7:尝试将项目复制到另一台Mac,看看问题是否仍然存在。您正在使用哪个xcode版本?如果是Xcode 9,则可以尝试使用Xcode 10 Beta。

答案 5 :(得分:0)

错误显示的文件名与.plist CFBundleAlternateIcons中的文件名不同。确保在其中分配了正确的文件名,并且该文件名实际上存在于项目文件夹中

错误显示AI-Gorgosaurus作为文件名。 .plist屏幕快照显示AI-Diabloceratops~ipad,也请从文件名中删除~符号。

确定文件正确后,清理并生成项目。确保您的项目文件夹中具有@2x@3x版的图标。

阅读Kaiyuan Xu答案,以更清楚地了解如何使用CFBundleAlternateIcons