我在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.")
}
}
}
我刚刚在另一个项目上进行了测试,效果很好!但是为什么不在我当前的项目上呢?你有什么主意吗
答案 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
下。
您正在混合使用CFBundleIcons
和CFBundleIcons~ipad
(这不是有效的密钥)。
答案 2 :(得分:2)
答案 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>
答案 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
。