it-swarm.com.de

Xcode 8-Build-Absturz unter iOS 9.2 und darunter

Wenn ich meine App mit Xcode 8 GM Seed baue und sie auf einem iOS 9.2-Gerät unterhalb des Gerätes OR simulator ausführe, bekomme ich merkwürdige Abstürze von EXC_BAD_ACCESS beim Start der App oder wenige Sekunden nach dem Start der App . Der Absturz erfolgt immer an einer anderen Stelle (Hinzufügen einer Unteransicht, [UIImage imageNamed:], Hauptmethode des App-Delegaten usw.). Ich bekomme solche Abstürze nicht, wenn ich es unter iOS 9.3 oder 10 laufe, und ich bekomme sie nicht, wenn ich build mit Xcode 7 und unter iOS 9.2 und darunter laufe. Hat jemand anderes etwas ähnliches erlebt? Ist dies ein bekanntes Problem mit Xcode 8?

85
Lingzhi Zhang

Siehe akzeptierte Antwort https://forums.developer.Apple.com/thread/60919

Mit Preview.app können Sie 16-Bit-Assets als 8-Bit-Assets speichern

Fehlerbehebung "Fehler ITMS-90682: Ungültiges Bundle - Der Asset-Katalog In 'Payload/XXXXX/Assets.car' kann keine 16-Bit- oder P3-Assets enthalten, wenn die App iOS 8 oder eine frühere Version unterstützt. "

Bei Xcode 8 GM tritt dieser Fehler auf, wenn Sie 16-Bit oder P3 .__ angeben. Assets in einer App-Übermittlung, die auf iOS-Versionen vor iOS abzielt 9.3. Wenn für Ihre App eine breite Farbfunktionalität erforderlich ist, müssen Sie Ihr Implementierungsziel auf iOS 9.3 oder höher ändern. Wenn Ihre App nicht Sie benötigen eine umfassende Farbfunktionalität, und Sie möchten sie auf älteren iOS-Versionen sollten Sie dann alle 16-Bit- oder P3-Assets durch .__ ersetzen. 8-Bit-sRGB-Assets. Sie können 16-Bit- oder P3-Assets finden, indem Sie .__ ausführen. "Assetutil" für den in der Fehlermeldung genannten Asset-Katalog von iTunes Connect. Die folgenden Schritte beschreiben den Prozess:

  1. Erstellen Sie eine inspizierbare .ipa-Datei. Wählen Sie im Xcode Organizer (Xcode-> Window-> Organizer) ein zu inspizierendes Archiv aus, und klicken Sie auf Klicken Sie auf "Exportieren ..." und wählen Sie "Exportieren für Enterprise- oder Ad-hoc-Bereitstellung" . Dadurch wird eine lokale Kopie der .ipa-Datei für Ihre App erstellt.

  2. Suchen Sie diese .ipa-Datei und ändern Sie die Erweiterung in .Zip.

  3. Erweitern Sie die ZIP-Datei. Dadurch wird ein Payload-Ordner erzeugt, der Ihr .app-Paket enthält.

  4. Öffnen Sie ein Terminal und ändern Sie das Arbeitsverzeichnis auf die oberste Ebene Ihres .app-Bundle-CD-Pfads/zu/Payload/your.app

  5. Verwenden Sie das Suchwerkzeug, um Assets.car-Dateien in Ihrem .app-Bundle wie folgt zu finden: find. -name 'Assets.car'

  6. Verwenden Sie das Assetutil-Tool, um 16-Bit- oder P3-Assets in jedem Assets.car Ihrer Anwendung zu finden, wie in der folgenden Abbildung gezeigt. : Sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json

  7. Überprüfen Sie die resultierende Datei /tmp/Assets.json und suchen Sie nach Inhalten, die "DisplayGamut" enthalten: "P3" und den zugehörigen "Namen". Dieser Wille Der Name Ihres Imagesets mit einem oder mehreren 16-Bit- oder P3-Dateien Vermögenswerte.

  8. Ersetzen Sie diese Assets durch 8-Bit/sRGB-Assets, und erstellen Sie anschließend Ihre App neu.

Update: Wenn Ihr Bereitstellungsziel auf 8.3 oder 8.4 eingestellt ist und Sie über eine .__ verfügen. Asset-Katalog erhalten Sie dann dieselbe Fehlermeldung, auch wenn Sie nicht haben tatsächlich 16-Bit- oder P3-Assets. In diesem Fall müssen Sie entweder Ihr Einsatzziel auf 8.2 oder auf 9.x verschieben. 

55

Ich hoffe, dieses Bash-Skript kann Ihnen helfen. Das Eingabeargument ist ein Verzeichnis, das alle Xcassets Ihres Projekts enthält Dieses Skript setzt das sRGB-Profil auf alle PNGs.

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

Ich konnte das Problem reproduzieren, und es scheint mit Bildern in Asset Catalog zu tun zu haben. Fehler bei Apple eingereicht (mit angefügtem Beispielprojekt) 

Apple Bug Reporter: 28371396

16
Evtim Georgiev

bearbeitete Skript zum Konvertieren von PNG-Dateien in das korrekte Format im gesamten Projekt und mit Leerzeichen:

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

gleicher Fehler. 

Ich bin nicht sicher, ob dies ein Fehler ist, aber hier ist meine Lösung: Stellen Sie sicher, dass Ihr Bild ohne Adobe RGB (1998) Farbraum ist

in xcode

3
ping

Hinzufügen für alle anderen mit einem ähnlichen Problem ...

Die App stürzte unter iOS 9.0 ab - iOS 9.2 war scheinbar zufällig/um Storyboard-Übergänge herum/um eine UIImage (Name ...) einzustellen .. Diesen Thread gefunden: ( https://forums.developer.Apple.) de/thread/61643 )

Wenn Ihre App auf iOS 8.4 ausgerichtet ist, stürzt sie unter iOS 9.0 - 9.2 in Xcode 8 ab. Dies hat etwas mit Xcassets zu tun. Durch das Setzen des Implementierungsziels auf 8.2 oder darunter (ich habe 8.0 verwendet) wurde dieses Problem behoben. Im Ernst. Schlimmster Fehler überhaupt.

1
karnett

Setzen Sie das iOS-Bereitstellungsziel inside Info Ihres Projekts und alle Ziele auf den gleichen Wert.

In meinem Fall war mein Projekt auf iOS 9.1 und das Target auf iOS 8.0 eingestellt und stürzte am Simulator mit iOS 8.4 ab.

Jetzt funktioniert es perfekt. 

PS .: Reinigen Sie das Projekt, bevor Sie es erneut ausführen.

0
Gustavo Barbosa

Obwohl die Frage bereits beantwortet wurde, funktioniert die akzeptierte Lösung für mich nicht, da ich keine 16-Bit/Kanal-Assets hatte. 

Ich habe festgestellt, dass das Problem für Assets aufgetreten ist, die mit dem lzfse-Algorithmus komprimiert wurden (Informationen zum Komprimieren von Informationen aus Assets.car finden Sie unter Verwendung von assetutil). Leider erlaubt Xcode IDE den Entwicklern nicht, den Kompressionsalgorithmus zu ändern. Sie können dies jedoch tun, indem Sie Assets manuell kompilieren und das Implementierungsziel im Befehl actool verringern.

tl; dr;

  1. Archiv
  2. ipa entpacken
  3. Assets kompilieren - Sie können den durch xcode generierten Asset-Compiler-Befehl finden, indem Sie die Archivprotokolle im Xcode-Berichtsnavigator überprüfen.

Beispielbefehl:

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. Schnauze.
  2. Rücktritt
0
badeleux