Crash de la build Xcode 8 sur iOS 9.2 et versions antérieures

85

Lorsque je crée mon application avec Xcode 8 GM Seed et que je l'exécute sur un appareil ou un simulateur iOS 9.2 ci-dessous, j'obtiens d'étranges plantages EXC_BAD_ACCESS lors du démarrage de l'application ou quelques secondes après le lancement de l'application. Le crash se produit toujours à un endroit différent (ajout d'une sous-vue, [UIImage imageNamed:]méthode principale du délégué d'application, etc.). Je ne reçois pas ces plantages lorsque je l'exécute sur iOS 9.3+ ou 10 et je ne les reçois pas lorsque je construis avec Xcode 7 et que je fonctionne sur iOS 9.2 et versions antérieures . Quelqu'un d'autre a-t-il vécu quelque chose de similaire? Est-ce un problème connu avec Xcode 8?

Lingzhi Zhang
la source
Tout d'abord, réinitialisez le contenu du simulateur. et essayez à nouveau.
Mehul
3
Avez-vous réussi à résoudre votre problème? Nous l'avons aussi.
animaonline
Pouvez-vous signaler un nouveau bogue sur bugreport.apple.com et joindre le projet d'exemple et les journaux de panne afin que nous puissions enquêter?
Quinn Taylor le
@QuinnTaylor - J'ai déposé un rapport de bogue avec le projet ci-joint (reproduit à 100% pour moi dans le simulateur) à bugreport.apple.com # 28371396. Merci d'avoir examiné cela!
Evtim Georgiev
3
@EvtimGeorgiev Merci! Il s'agit d'un doublon d'un bogue iOS lié aux images .png P3, et devrait être corrigé dans le SDK bêta iOS 10.1 inclus dans Xcode 8.1 beta, qui a été publié aujourd'hui. Pouvez-vous essayer de construire avec ça?
Quinn Taylor

Réponses:

55

Voir la réponse acceptée https://forums.developer.apple.com/thread/60919

Vous pouvez enregistrer des actifs 16 bits au format 8 bits avec Preview.app

Comment résoudre "ERREUR ITMS-90682: Bundle non valide - Le catalogue d'actifs dans 'Payload / XXXXX / Assets.car' ne peut pas contenir d'actifs 16 bits ou P3 si l'application prend en charge iOS 8 ou une version antérieure."

Avec Xcode 8 GM, cette erreur se produit si vous incluez des actifs 16 bits ou P3 dans une soumission d'application ciblant les versions iOS antérieures à iOS 9.3. Si votre application nécessite une fonctionnalité de couleur étendue, vous devez modifier votre cible de déploiement sur iOS 9.3 ou version ultérieure. Si votre application ne nécessite pas de fonctionnalités de couleurs étendues et que vous souhaitez la déployer sur les anciennes versions d'iOS, vous devez remplacer tous les actifs 16 bits ou P3 par des actifs sRGB 8 bits. Vous pouvez trouver des actifs 16 bits ou P3 en exécutant «assetutil» sur le catalogue d'actifs nommé dans le message d'erreur d'iTunes Connect. Les étapes suivantes décrivent le processus:

  1. Créez un fichier .ipa inspectable. Dans Xcode Organizer (Xcode-> Window-> Organizer), sélectionnez une archive à inspecter, cliquez sur «Exporter ...» et choisissez «Exporter pour un déploiement en entreprise ou ad hoc». Cela créera une copie locale du fichier. ipa pour votre application.

  2. Localisez ce fichier .ipa et changez son extension en .zip.

  3. Développez le fichier .zip. Cela produira un dossier Payload contenant votre bundle .app.

  4. Ouvrez un terminal et changez le répertoire de travail au niveau supérieur de votre chemin de cd du bundle .app / vers / Payload / your.app

  5. Utilisez l'outil de recherche pour localiser les fichiers Assets.car dans votre bundle .app comme indiqué ci-dessous: find. -name 'Assets.car'

  6. Utilisez l'outil assetutil pour rechercher des actifs 16 bits ou P3, dans chaque Assets.car de votre application, comme indiqué ci-dessous. :sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json

  7. Examinez le fichier /tmp/Assets.json résultant et recherchez tout contenu contenant «DisplayGamut»: «P3» et son «nom» associé. Ce sera le nom de votre ensemble d'images contenant un ou plusieurs éléments 16 bits ou P3.

  8. Remplacez ces actifs par des actifs 8 bits / sRGB, puis reconstruisez votre application.

Mise à jour: si votre cible de déploiement est définie sur 8.3 ou 8.4 et que vous disposez d'un catalogue d'actifs, vous recevrez ce même message d'erreur, même si vous ne disposez pas réellement d'actifs 16 bits ou P3. Dans ce cas, vous devrez soit réduire votre cible de déploiement à 8.2, soit la déplacer jusqu'à 9.x.

Kostia Dombrovsky
la source
2
Quel est le lien avec EXC_BAD_ACCESS?
animaonline
1
Veuillez ne pas dupliquer les réponses. À la place, marquez les questions comme des doublons.
JAL
Merci mec! Vous m'avez fait gagner beaucoup de temps avec cette réponse! )
Thorax
3
Dans mon projet (la cible de déploiement est 8.0), il n'y a pas d'actifs P3. Je reçois toujours un crash sur l'application ou au hasard à n'importe quel endroit avec xcode 8. Tous les actifs sont de 8 bits / sRGB. Quelqu'un a-t-il toujours rencontré le même problème
Ankit
@Ankit, nous sommes confrontés au même problème. Avez-vous encore trouvé une solution?
Roman Truba
32

J'espère que ce script bash peut vous aider. L'argument d'entrée est un répertoire contenant tous les xcassets de votre projet. Ce script définira le profil sRGB sur tous les png. Ça m'a aidé:)

#!/bin/bash
DIRECTORY=$1
echo "------------------------------"
echo "Passed Resources with xcassets folder argument is <$DIRECTORY>"
echo "------------------------------"
echo "Processing asset:"
XSAASSETSD="$(find "$DIRECTORY" -name '*.xcassets')"
for xcasset in $XSAASSETSD
do
    echo "---$xcasset"
    IMAGESETS="$(find "$xcasset" -name '*.imageset')"
    for imageset in $IMAGESETS
    do
        echo "------$imageset"
        FILES="$(find "$imageset" -name '*.png')"
        for file in $FILES 
        do
            echo "---------$file"
            sips -m "/System/Library/Colorsync/Profiles/sRGB Profile.icc" $file --out $file
        done
    done
done
echo "------------------------------"
echo "script successfully finished"
echo "------------------------------"
Aleksandr Terentev
la source
Nos ressources ne contiennent aucune image défectueuse, mais nous obtenons toujours ces erreurs.
animaonline
@animaonline, cela aide si l'application contient vraiment des actifs 16 bits ou P3.
Aleksandr Terentev
2
Je pense que le principal problème est que personne n'a en fait confirmé que cette erreur était causée par des actifs.
animaonline
a fonctionné au début, mais ensuite pas, il ne
plante
1
Le script n'a pas fonctionné pour moi, mais l'utilisation d'ImageOptim a fonctionné
deej
16

J'ai pu reproduire le problème et il semble lié aux images du catalogue d'actifs. A déposé un bug avec Apple (avec exemple de projet joint)

Apple Bug Reporter: 28371396

Evtim Georgiev
la source
Je ne parviens pas à télécharger l'exemple de projet. Pouvez-vous partager le projet pour reproduire le crash
Tamil
Merci. Problèmes liés à Asset Catalog, il suffit de changer l'espace colorimétrique d'Adobe RGB (1998) en sRGB.
Timur Bernikovich
13

script édité pour convertir les fichiers png au format correct dans tout le projet et avec des espaces blancs:

#!/bin/bash
DIRECTORY=$1
echo "------------------------------"
echo "Passed Resources with xcassets folder argument is <$DIRECTORY>"
echo "------------------------------"
echo "Processing asset:"

find "$DIRECTORY" -name '*png' -print0 | while read -d $'\0' file; 
do 
    echo "---------$file"
    sips -m "/System/Library/Colorsync/Profiles/sRGB Profile.icc" "$file" --out "$file"
done

echo "------------------------------"
echo "script successfully finished"
echo "------------------------------"
Никита Конопелько
la source
1
Ce script est un peu plus précis. Спасибо, Никита.
seelts
1
Cela fonctionne comme un charme. Script simple mais efficace. Pour les personnes qui ne savent pas comment exécuter ce script .. Etapes: 1) Mettez ce script dans un fichier txt et renommez-le en AssetsScript.sh 2) Accédez au dossier Images.xcassets et conservez le fichier de script 3) Dans la ligne de commande, allez dans le dossier où se trouve votre fichier de script 4) Changez les autorisations des fichiers de script en exécutable (chmod 755 AssetsScript.sh) 5) exécutez le fichier de script avec directoryName comme paramètre dans la ligne de commande elle-même (./AssetsScript.sh Images.xcassets). Boom cela convertit tous vos actifs au format requis et c'est fait. L'application fonctionnera désormais correctement.
Srivathsa
En une ligne, while IFS= read -d '' -r file; do if [ $(file "$file" | grep -c '16-bit') -eq 1 ]; then sips -m '/System/Library/Colorsync/Profiles/sRGB Profile.icc' "$file"; fi done < <(find . -print0)qui ne fera que convertir une image 16 bits en 8 bits
DawnSong
3

même problème.

Je ne sais pas s'il s'agit d'un bogue mais voici ma solution: assurez-vous que vos ressources image ne contiennent pas d'espace colorimétrique Adobe RGB (1998)

dans xcode

ping
la source
1
Que voulez-vous dire? Pourriez-vous élaborer?
animaonline
1
L'affichage d'une image avec l'espace colorimétrique Adobe RVB (1998) fonctionnait pour moi sur le débogage sur un appareil avec Xcode 8 et Swift 3, mais n'était pas sur la sortie sur iOS 9. Changer l'espace colorimétrique l'a fait fonctionner.
Andrew
1

Ajout pour toute autre personne ayant un problème similaire ...

L'application plantait sur iOS 9.0 - iOS 9.2 sur ce qui semblait aléatoire / autour des transitions de Storyboard / autour de la définition d'une UIImage (nom ...) .. J'ai trouvé ce fil: ( https://forums.developer.apple.com/thread/61643 )

Si votre application cible iOS 8.4, elle plantera sous iOS 9.0 - 9.2 dans Xcode 8 .. quelque chose à voir avec xcassets. La définition de la cible de déploiement sur 8.2 ou moins (j'ai utilisé 8.0) l'a corrigé pour moi. Sans blague. Le pire bug de tous les temps.

Karnett
la source
Salut. Aidez-moi! Je vis quelque chose comme ça, sauf UNIQUEMENT dans l'AppStore. Lorsque je crée mon application directement sur un iPhone avec iOS 9.2.1, elle ne plante pas, ni sur le simulateur, mais lorsque je télécharge exactement la même version / build depuis AppStore, elle plante. Était-ce également le cas avec vous?
Sti
@Sti non, il plantait dans la version de débogage. Utilisez-vous des données de base ou tout autre élément susceptible de poser un problème lors de l'écrasement d'une ancienne version? Juste une pensée.
karnett
Bonne réflexion, et oui, j'utilise des données de base dans certaines parties de l'application. Mais après de nombreux tests, je suis convaincu que cela n'a rien à voir avec cela. Les données de base n'ont rien à voir avec mes images, et presque toutes mes traces de pile de mon système de rapport de plantage indiquent que UIImage (imageNamed :) est le méchant. Oh, et cela se produit également sur les installations propres. Plus de 7000 plantages les deux derniers jours, n'affectant que iOS 9.0.2 à 9.2.1 .. Pas iOS 9.3 ou version ultérieure .. Tellement bizarre. Et cela n'arrive pas quand je le construis maintenant. Seulement AppStore. Impossible de déboguer. J'ai envoyé un ticket TSI à Apple tout à l'heure.
Sti
Ooh. C'est gluant. Juste une autre pensée. Quelle version de Swift la version de l'App Store utilise-t-elle? Je pense que j'ai vécu cela dans Swift 2.2 ou 2.3. Pas Swift 3. J'imagine que vous construisez maintenant avec Swift 3 et que vous ne pouvez pas le reproduire?
karnett
Non, mais c'est très intéressant que vous disiez ça! Nous avons cette application sur l'App Store depuis longtemps. La version précédente sur l'App Store a été écrite en Swift 2.3 et n'a pas rencontré ce bogue. Cette nouvelle version sur l'App Store que j'ai téléchargée il y a quelques jours (celle qui plante) comporte très peu de modifications mais très importantes, notamment la conversion en Swift 3. Un autre changement notable est l'ajout d'un widget exclusivement pour iOS 10.
Sti
0

Définissez la cible de déploiement iOS dans les informations de votre projet et toutes les cibles sur la même valeur.

Dans mon cas, mon projet a été défini sur iOS 9.1 et la cible a été définie sur iOS 8.0 et plantait sur Simulator avec iOS 8.4

Maintenant, cela fonctionne parfaitement.

PS: Nettoyez le projet avant de le relancer.

Gustavo Barbosa
la source
0

Bien que la question ait déjà été répondue, la solution acceptée ne fonctionne pas pour moi, car je n'avais aucun actif 16b / ch.

J'ai trouvé que ce problème est apparu pour les actifs compressés à l'aide d'un lzfsealgorithme (vous pouvez trouver des informations sur la compression en extrayant des informations à partir d'Assets.car en utilisant assetutil). Malheureusement, Xcode IDE ne permet pas aux développeurs de modifier l'algorithme de compression, mais vous pouvez le faire en compilant manuellement les actifs et en abaissant la cible de déploiement dans la actoolcommande.

tl; dr;

  1. Archiver
  2. Décompressez ipa
  3. Compiler les actifs - Vous pouvez trouver la commande du compilateur d'actifs pour votre projet générée par xcode en vérifiant les journaux d'archive dans le navigateur de rapport Xcode

Exemple de commande:

xcrun actool --output-format human-readable-text --notices --warnings --minimum-deployment-target 8.0 --output-partial-info-plist info_partial.plist --app-icon AppIcon --launch-image LaunchImage --enable-on-demand-resources YES --sticker-pack-identifier-prefix {bundle_id}.sticker-pack --target-device iphone --target-device ipad --platform iphoneos --product-type com.apple.product-type.application --compile #{path_to_directory_containing_Assets_car} Assets/Assets.xcassets

  1. Zip-le.
  2. Démissionner
Badeleux
la source