IPadでアプリのアイコンを変更する際に問題が発生しました。 iPhoneではすべて正常に動作していますが、iPadではこのエラーが発生します:
[デフォルト] ...:0>エラーのpreferredIconNameをAI-Gorgosaurusに設定できませんでした:エラードメイン= NSCocoaErrorDomainコード= 4「ファイルが存在しません。」 UserInfo = {NSUnderlyingError = 0x600000248a30 {Error Domain = LSApplicationWorkspaceErrorDomain Code = -105 "iconNameがCFBundleAlternateIconsエントリに見つかりません" UserInfo = {NSLocalizedDescription = iconNameがCFBundleAlternateIconsエントリに見つかりません}}}ファイルが存在しないためにアプリアイコンが失敗しました。
広告を検索したところ、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.")
}
}
}
別のプロジェクトでテストしたところ、正常に動作しました!!!しかし、私の現在のプロジェクトではなぜですか?!何か考えがありますか?
Info.plistの構造が正しくありません。
あなたが持っている:
- CFBundleIcons
- CFBundleAlternateIcons
- Icon Name
- CFBundleFilesIcons
- CFBundleFilesIcons~ipad
しかし、それは次のようになります。
- CFBundleIcons
- CFBundleAlternateIcons
- Icon Name
- CFBundleFilesIcons
- CFBundleIcons~ipad
- CFBundleAlternateIcons
- Icon Name
- CFBundleFilesIcons
基本的に、iPhoneアイコンCFBundleIcons
で動作するようになったら、ツリー全体をCFBundleIcons~ipad
として複製します。 iPadファイルはCFBundleIcons
の下にネストしないでください。
CFBundleIcons~ipad
とCFBundleIconFiles~ipad
(これは有効なキーではありません)を混同しています。
私が気付いたのは、あなたの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の場合は、Xcode10ベータ版を使用してみてください。
エラーは、.plist CFBundleAlternateIcons
にあるものとは異なるファイル名を示しています。に正しいファイル名を割り当て、それが実際にプロジェクトフォルダに存在することを確認してください。
エラーファイル名としてAI-Gorgosaurus
が表示されます。 .plistのスクリーンショットはAI-Diabloceratops~ipad
を示しています。また、ファイル名から~
記号を削除してください。
ファイルが正しいことを確認したら、クリーンアップしてプロジェクトをビルドします。 プロジェクトフォルダにアイコンの@2x
および@3x
バージョンがあることを確認してください。
Kaiyuan XCFBundleAlternateIcons
の使用方法に関するより明確な図については回答をお読みください。
この回答のより再利用可能な(コピー/貼り付けが簡単な)バージョンを提供しようとしています。
1)通常の.pngファイルとして追加された次の名前とサイズの画像が必要です(アセットカタログなし)
.../AppIcon-Dark/iPad-app.png
pixelWidth: 76
.../AppIcon-Dark/[email protected]
pixelWidth: 152
.../AppIcon-Dark/[email protected]
pixelWidth: 167
.../AppIcon-Dark/[email protected]
pixelWidth: 120
.../AppIcon-Dark/[email protected]
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))")
}
}
}
}
以下の構造で、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>