【问题标题】:Changing alternate icon for iPad更改 iPad 的备用图标
【发布时间】:2019-01-27 16:28:21
【问题描述】:

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

[default] 无法将preferredIconName 设置为AI-Gorgosaurus for ...:0>错误:错误 Domain=NSCocoaErrorDomain Code=4 "该文件不存在。" UserInfo={NSUnderlyingError=0x600000248a30 {错误 域=LSApplicationWorkspaceErrorDomain 代码=-105 "未找到图标名称 在 CFBundleAlternateIcons 条目中" UserInfo={NSLocalizedDescription=iconName 未在 CFBundleAlternateIcons entry}}} 应用程序图标失败,原因是文件 不存在。

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

代码如下:

  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.")
            }
        }
    }

我刚刚在另一个项目上进行了测试并且工作正常!!!但不是我目前的项目,为什么?!你有什么想法吗?

【问题讨论】:

  • iPad 的图片尺寸是多少?
  • @DanielSpringer 我刚刚为所有设备使用了 700 × 700 px。
  • 即使图像尺寸更大,我也无法在 iPad 上使用它

标签: ios iphone swift xcode ipad


【解决方案1】:

您的 info.plist 结构不正确。

你有:

- CFBundleIcons
  - CFBundleAlternateIcons
    - Icon Name
      - CFBundleIconFiles
      - CFBundleIconFiles~ipad

但应该是:

- CFBundleIcons
  - CFBundleAlternateIcons
    - Icon Name
      - CFBundleIconFiles
- CFBundleIcons~ipad
  - CFBundleAlternateIcons
    - Icon Name
     - CFBundleIconFiles

基本上,一旦您使用 iPhone 图标 CFBundleIcons,将整个树复制为 CFBundleIcons~ipad。 iPad 文件根本不应该嵌套在CFBundleIcons 下。

您混淆了CFBundleIcons~ipadCFBundleIconFiles~ipad(这不是有效的密钥)。

【讨论】:

  • iPad 的图片尺寸是多少?
  • @DanielSpringer 啊,这就是“原始键和值”与友好名称的区别。右键单击键来回切换。
  • @DaveWood ? 拥抱戴夫
  • 感谢分享这个 Dave,为我节省了很多时间。
  • 这行得通,非常感谢
【解决方案2】:

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

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))")
            }
        }
    }
}

【讨论】:

  • 谢谢你!在有关该主题的文章中无法找到此信息。他们只是忽略了有多种图标大小的事实
【解决方案3】:

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

【讨论】:

  • UIPrerenderedIcon 是做什么的,为什么你有一个NO 和另一个YES
【解决方案4】:

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

将其更改为是

可能是渲染的问题

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

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

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

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

如果这没有帮助,请尝试上述步骤。但首先尝试将整个项目移动到不同的文件夹。

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

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

编辑 6:尝试从模拟器或您正在尝试的设备中删除应用程序并重新安装。整个问题可能与更新和应用程序先前版本的剩余部分有关。

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

【讨论】:

  • 添加 .png 扩展名看看是否有帮助
  • 尝试将新图标文件名更改为 ipadAlternate.png,然后在 plist 中更改为相同,因为看起来您的 plist 和图标文件本身存在某种不匹配
  • 您能在 github 或其他地方分享您的代码,以便我可以分叉或贡献代码吗??
  • 这是一个大项目,如果我创建一个新项目但不能在我当前的项目上工作,它就可以工作!!!那是我的问题。 !!!
  • 只需分享其中的一部分,它将编译并出现错误,或者您可以创建另一个分支,我可以尝试提供帮助。
【解决方案5】:

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

错误将AI-Gorgosaurus 显示为文件名。 .plist 截图显示AI-Diabloceratops~ipad,也请从文件名中删除~ 符号。

在确定文件正确后,进行清理并构建项目。确保您的项目文件夹中有@2x@3x 版本的图标。

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

【讨论】:

  • 图片旧了,我检查了一切。
  • 好的,我们来做屏幕共享,我需要更清楚地了解问题。
【解决方案6】:

通过以下结构,我可以更改 iPad 中的图标:

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

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

        UIApplication.shared.setAlternateIconName(newAppIconName)
    }
}

Plist 代码:

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

【讨论】:

  • 谢谢,但我正在这样做,但我得到的是错误!
  • CFBundleAlternateIcons entry" UserInfo={NSLocalizedDescription=iconName not found in CFBundleAlternateIcons entry}}} App icon failed to due to The file doesn’t exist.
  • 你可以看到我使用的是CFBundleIcons~ipad,而你是CFBundleIconsFiles~ipad
  • 请您尝试用我的代码更改您的代码。因为它对我有用。
  • 其实我已经离开了办公室,但明天肯定能帮上忙。
猜你喜欢
  • 1970-01-01
  • 2018-07-07
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多