web-dev-qa-db-ja.com

iPadの代替アイコンを変更する

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

enter image description here

別のプロジェクトでテストしたところ、正常に動作しました!!!しかし、私の現在のプロジェクトではなぜですか?!何か考えがありますか?

15
Mc.Lover

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~ipadCFBundleIconFiles~ipad(これは有効なキーではありません)を混同しています。

Screenshot

2
Dave Wood

IPhoneとiPadの代替アイコンを設定するには、plistファイルにこれらの変更を加えてください。

enter image description here

1
Rizwan Shaikh

私が気付いたのは、あなたの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ベータ版を使用してみてください。

1
AD Progress

エラーは、.plist CFBundleAlternateIconsにあるものとは異なるファイル名を示しています。に正しいファイル名を割り当て、それが実際にプロジェクトフォルダに存在することを確認してください。

エラーファイル名としてAI-Gorgosaurusが表示されます。 .plistのスクリーンショットはAI-Diabloceratops~ipadを示しています。また、ファイル名から~記号を削除してください。

ファイルが正しいことを確認したら、クリーンアップしてプロジェクトをビルドします。 プロジェクトフォルダにアイコンの@2xおよび@3xバージョンがあることを確認してください。

Kaiyuan XCFBundleAlternateIconsの使用方法に関するより明確な図については回答をお読みください。

0
Farhad

この回答のより再利用可能な(コピー/貼り付けが簡単な)バージョンを提供しようとしています。

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))")
            }
        }
    }
}
0
Confused Vorlon

以下の構造で、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>

enter image description here

0
iVarun