web-dev-qa-db-fra.com

Changer d'icône alternative pour iPad

J'ai un problème avec le changement d'icône de l'application sur iPad. Tout fonctionne bien sur iPhone mais sur iPad, j'obtiens cette erreur: 

[défaut] Impossible de définir AI-Gorgosaurus avec PreferredIconName pour ...: 0> erreur: Erreur Domaine = NSCocoaErrorDomain Code = 4 "Le fichier n'existe pas." UserInfo = {NSUnderlyingError = 0x600000248a30 {Erreur Domaine = LSApplicationWorkspaceErrorDomain Code = -105 "iconName non trouvé Dans l'entrée CFBundleAlternateIcons" ".____.] UserInfo = {NSLocalizedDescription = iconName introuvable. Entrée CFBundleAlternateIcons}}} L'icône de l'application a échoué car le fichier N'existe pas.

J'ai cherché une annonce et trouvé qu'il me fallait ajouter ~ipad dans CFBundleIconFiles mais j'obtiens toujours la même erreur !.

Voici le code:

  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

Je viens de tester sur un autre projet et fonctionne bien !!! mais pas sur mon projet actuel pourquoi?! As-tu une idée? 

7
Mc.Lover

Votre info.plist est mal structuré.

Tu as:

- CFBundleIcons
  - CFBundleAlternateIcons
    - Icon Name
      - CFBundleFilesIcons
      - CFBundleFilesIcons~ipad

Mais cela devrait être:

- CFBundleIcons
  - CFBundleAlternateIcons
    - Icon Name
      - CFBundleFilesIcons
- CFBundleIcons~ipad
  - CFBundleAlternateIcons
    - Icon Name
     - CFBundleFilesIcons

CFBundleIcons, dupliquez l'intégralité de l'arborescence en tant que CFBundleIcons~ipad. Les fichiers iPad ne doivent pas du tout être imbriqués dans CFBundleIcons.

Vous mélangez CFBundleIcons~ipad et CFBundleIconFiles~ipad (qui n'est pas une clé valide).

 Screenshot

2
Dave Wood

Veuillez apporter ces modifications à votre fichier plist pour définir d'autres icônes pour iPhone et iPad.

 enter image description here

1
Rizwan Shaikh

Ce que j’ai remarqué, c’est que votre plist a UIPrerenderedIcon réglé sur NO.

Changez-le en OUI

Il se peut que le problème est avec le rendu

Edit 1: ajoutez l'extension .png pour voir si cela aide

EDIT 2: Essayez de changer le nom de fichier de la nouvelle icône en ipadAlternate.png. Puis changez le même nom dans le plist, car il semble y avoir une sorte d’incohérence entre votre plist et le fichier icône lui-même.

EDIT 3: Avez-vous nettoyé le dossier DerivedData? J'ai eu un problème il y a quelque temps et rien n'a aidé à nettoyer le projet, etc. Mais j'ai essayé de tout supprimer dans le dossier/Users/YOURUSERNAME/Library/Developer/Xcode/DerivedData/et tout a recommencé à fonctionner. Cela vaut la peine d'essayer.

EDIT 4: Essayez de faire l’étape de EDIT 3. Redémarrez ensuite votre projet et supprimez tous les fichiers d’icône alternatifs. Choisissez déplacer vers la corbeille, puis CMD + MAJ + K pour nettoyer. Ensuite, sélectionnez CMD + B à construire. Ajoutez ensuite les icônes là où elles étaient. Vérifiez que la cible est correctement sélectionnée et copiez les éléments à sélectionner. Pour une raison quelconque, Xcode a perdu la trace de votre fichier et affiche une erreur, pas de fichier.

Si cela ne vous aidera pas, essayez les étapes ci-dessus. Mais essayez d'abord de déplacer l'ensemble du projet dans un autre dossier.

EDIT 5: Il y a une autre idée que vous pourriez essayer par vous-même. Essayez de supprimer le fichier plist dans le projet actuel (conservez une copie de sauvegarde de celui-ci avant de le supprimer), puis démarrez un nouveau projet dans lequel la modification de l'icône fonctionne correctement. Ajoutez le plist de ce projet à celui-ci. Vérifiez si l'icône changeante fonctionne. Si oui, alors ajoutez toutes les clés manquantes que vous aviez dans le projet précédent.

AVERTISSEMENT: Ceci est un dernier recours, mais cela peut fonctionner. Commencez un nouveau projet et configurez-le avec les icônes que vous souhaitez alterner. Vérifiez si elles fonctionnent en premier, puis ajoutez tout le code et les dépendances du projet où cela ne fonctionne pas. Il suffit de ne pas écraser les fichiers PLIST.

EDIT 6: essayez de supprimer l'application du simulateur ou du périphérique que vous essayez, puis réinstallez-la. Toute la question pourrait être avec la mise à jour et les restes de la version précédente de l'application.

EDIT 7: Essayez de copier le projet sur un autre Mac et voyez si le problème persiste. Quelle version de xcode utilisez-vous? Si c'est Xcode 9, essayez peut-être d'utiliser la version bêta de Xcode 10.

1
AD Progress

L'erreur indique un nom de fichier différent de celui de .plist CFBundleAlternateIcons. Assurez-vous d’affecter un nom de fichier correct et qu’il existe réellement existe dans le dossier du projet

Erreur Affiche AI-Gorgosaurus comme nom de fichier. La capture d'écran .plist montre AI-Diabloceratops~ipad; veuillez également supprimer le symbole ~ du nom du fichier. 

Effectuez un nettoyage et générez le projet après vous être assuré que le fichier est correct. Assurez-vous que vous avez la version @2x et @3x de vos icônes dans votre dossier project .

Lisez Kaiyuan Xu answer pour une image plus claire de la façon d'utiliser CFBundleAlternateIcons.

0
Farhad

Avec la structure ci-dessous, je peux changer d'icône dans l'iPad:

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

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

        UIApplication.shared.setAlternateIconName(newAppIconName)
    }
}

Code de la pliste:

<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