swift 更改iPad的备用图标

9o685dep  于 2023-03-07  发布在  Swift
关注(0)|答案(7)|浏览(171)

我在iPad上更改应用程序图标时遇到问题。在iPhone上一切正常,但在iPad上出现此错误:
[默认值]无法将首选图标名称设置为AI-Gorgosaurus ...:0〉错误:错误域= NSCocoaErrorDomain代码= 4 "文件不存在。"用户信息= {NSUnderlyingError = 0x600000248a30 {错误域= LSApplicationWorkspaceErrorDomain代码= -105 "在CFBundleAlternateIcons条目中未找到iconName"用户信息= {NSLocalizedDescription =在CFBundleAlternateIcons条目中未找到iconName}}}应用程序图标失败,原因是文件不存在。
我搜索广告发现我需要在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.")
            }
        }
    }

我刚刚测试了另一个项目,工作很好!!!但不是在我目前的项目为什么?!你有什么想法吗?

mrfwxfqh

mrfwxfqh1#

您的信息列表结构不正确。
您已经:

- 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(这不是有效的密钥)。

cngwdvgl

cngwdvgl2#

尝试给予此答案的更可重复使用(易于复制/粘贴)的版本。
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

然后你可以在你的信息列表中添加/插入以下内容

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

zte4gxcn3#

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

2w2cym1i

2w2cym1i4#

使用Xcode 13+,您无需再手动处理文件/plist。您只需将构建设置下的“包含所有应用图标资产”设置设为。或者点击“您的目标”-常规-应用图标和启动屏幕-包含所有应用图标资产。

之后,只需添加图标到xcassets目录。(由于某种原因,它并不总是与单一大小的图标在iPad上工作,所以你应该更好地使用所有图标大小的图标集)。
最好避免在图标名称中使用符号。我在iPad上使用图标名称“Icon-Red"时不起作用,但使用“IconRed”时效果很好
使用前面答案中提供的代码。
快速样本

UIApplication.shared.setAlternateIconName("IconRed", completionHandler: nil)

目标C样本

[[UIApplication sharedApplication] setAlternateIconName:@"IconRed" completionHandler:nil];
d7v8vwbk

d7v8vwbk5#

我注意到您的plist将UIPrenderedIcon设置为NO
将其更改为YES
问题可能出在渲染上
编辑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。

rekjcdws

rekjcdws6#

错误是显示的文件名与.plist CFBundleAlternateIcons中的文件名不同。请确保在中指定了正确的文件名,并且该文件名确实存在于项目文件夹中。
错误显示AI-Gorgosaurus作为文件名。.plist屏幕截图显示AI-Diabloceratops~ipad,还请从文件名中删除~符号。
做一个清洁和建立项目后,你确定文件是正确的。确保你有你的图标的@2x@3x版本在你的项目文件夹
阅读Kaiyuan Xu答案,以更清楚地了解如何使用CFBundleAlternateIcons

fbcarpbf

fbcarpbf7#

与下面的结构,我能够改变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>

相关问题