web-dev-qa-db-fra.com

Xcode 8 crash sur iOS 9.2 et inférieur

Lorsque je construis mon application avec Xcode 8 GM Seed et que je l'exécute sur un simulateur d'appareil iOS <9.2> sous OR, des plantages étranges se produisent EXC_BAD_ACCESS au démarrage de l'application ou quelques secondes après le lancement de l'application. . Le crash se produit toujours à un endroit différent (en ajoutant une sous-vue, [UIImage imageNamed:], la méthode principale du délégué de l'application, etc.). Je ne reçois pas ces blocages 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 m'exécute sur iOS 9.2 et versions ultérieures. Quelqu'un d'autre a-t-il vécu quelque chose de similaire? Est-ce un problème connu avec Xcode 8?

85
Lingzhi Zhang

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: Ensemble 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 produira si vous incluez 16 bits ou P3 actifs dans une soumission d'application ciblant les versions iOS antérieures, puis iOS 9.3 Si votre application nécessite une fonctionnalité couleur étendue, vous devez modifier votre cible de déploiement sur iOS 9.3 ou version ultérieure. Si votre application ne le fait pas Vous avez besoin d’une large palette de couleurs et vous souhaitez le déployer sur une version plus ancienne Dans les versions iOS, vous devez remplacer tous les actifs 16 bits ou P3 par Actifs sRGB 8 bits. Vous pouvez rechercher des ressources 16 bits ou P3 en exécutant «Assetutil» sur le catalogue d'actifs nommé dans le message d'erreur de iTunes Connect. Les étapes suivantes décrivent le processus:

  1. Créez un fichier .ipa inspectable. Dans l'organiseur Xcode (Xcode-> Fenêtre-> Organiseur), sélectionnez une archive à inspecter, cliquez sur "Exporter ...", puis 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 remplacez le répertoire de travail par le répertoire supérieur de votre dossier de cd .app/par/Payload/your.app.

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

  6. Utilisez l'outil assetutil pour rechercher des actifs 16 bits ou P3, dans chaque fichier 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 obtenu et recherchez tout contenu contenant «DisplayGamut»: «P3» et son «nom» associé. Cette volonté être le nom de votre jeu d'images contenant un ou plusieurs 16 bits ou P3 les atouts.

  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 avez un catalogue d’actifs, vous recevrez alors le même message d’erreur, même si vous ne le faites pas ont effectivement des actifs 16 bits ou P3. Dans ce cas, vous devrez soit baisser votre cible de déploiement vers 8.2, ou déplacez-la vers 9.x. 

55
Kostia Dombrovsky

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 pngs . Cela 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 "------------------------------"
32
Aleksandr Terentev

J'ai réussi à reproduire le problème et il semble lié aux images dans Asset Catalog. A déposé un bogue avec Apple (avec l'exemple de projet joint 

Apple Bug Reporter: 28371396

16
Evtim Georgiev

script modifié pour convertir les fichiers png au format correct dans l'ensemble du projet et avec des espaces

#!/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 "------------------------------"

même problème. 

Je ne sais pas s'il s'agit d'un bogue, mais voici la solution: assurez-vous que vos ressources d'image ne sont pas occupées par l'espace de couleur Adobe RGB (1998)

en xcode

3
ping

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

Dans mon cas, mon projet était défini sur iOS 9.1 et la cible sur iOS 8.0 et se bloquait sur le simulateur avec iOS 8.4

Maintenant cela fonctionne parfaitement. 

PS: Nettoyez le projet avant de relancer.

0
Gustavo Barbosa

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 constaté que ce problème était lié à des ressources compressées à l'aide de l'algorithme lzfse (vous pouvez trouver des informations sur la compression extrayant les informations de Assets.car à l'aide de assetutil). Malheureusement, Xcode IDE n'autorise pas les développeurs à modifier l'algorithme de compression. Toutefois, vous pouvez le faire en compilant les actifs manuellement et en abaissant la cible de déploiement dans la commande actool.

tl; dr;

  1. Archiver
  2. Décompressez ipa
  3. Compiler les actifs - Vous pouvez trouver une commande de compilation d’actifs pour votre projet générée par xcode en consultant les journaux d’archivage dans 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
0
badeleux