Xcode 8 Build Crash unter iOS 9.2 und niedriger

85

Wenn ich meine App mit Xcode 8 GM Seed erstelle und sie auf einem iOS 9.2 unter Gerät ODER Simulator ausführe, kommt es beim Start der App oder einige Sekunden nach dem Start der App zu seltsamen Abstürzen von EXC_BAD_ACCESS. Der Absturz ereignet sich immer an einer anderen Stelle (Hinzufügen einer Unteransicht, der Hauptmethode des [UIImage imageNamed:]App-Delegaten usw.). Ich bekomme diese Abstürze nicht, wenn ich es unter iOS 9.3+ oder 10 ausführe, und ich bekomme sie nicht, wenn ich mit Xcode 7 baue und unter iOS 9.2 und niedriger ausführe. Hat jemand etwas Ähnliches erlebt? Ist dies ein bekanntes Problem mit Xcode 8?

Lingzhi Zhang
quelle
Setzen Sie zunächst den Inhalt des Simulators zurück. und versuche es erneut.
Mehul
3
Konnten Sie Ihr Problem lösen? Wir haben es auch.
Animaonline
Können Sie einen neuen Fehler unter bugreport.apple.com einreichen und das Beispielprojekt und die Absturzprotokolle anhängen, damit wir dies untersuchen können?
Quinn Taylor
@QuinnTaylor - Ich habe einen Fehlerbericht mit angehängtem Projekt (100% für mich im Simulator reproduziert) unter bugreport.apple.com # 28371396 eingereicht. Vielen Dank, dass Sie sich damit befasst haben!
Evtim Georgiev
3
@EvtimGeorgiev Danke! Es ist ein Duplikat eines iOS-Fehlers im Zusammenhang mit P3 .png-Bildern und sollte im iOS 10.1 Beta SDK behoben werden, das in Xcode 8.1 Beta enthalten ist, das heute veröffentlicht wurde. Können Sie versuchen, damit zu bauen?
Quinn Taylor

Antworten:

55

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

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

So beheben Sie "FEHLER ITMS-90682: Ungültiges Bundle - Der Asset-Katalog unter" Payload / XXXXX / Assets.car "darf keine 16-Bit- oder P3-Assets enthalten, wenn die App iOS 8 oder früher unterstützt."

Bei Xcode 8 GM tritt dieser Fehler auf, wenn Sie 16-Bit- oder P3-Assets in eine App-Übermittlung aufnehmen, die auf iOS-Versionen vor iOS 9.3 abzielt. Wenn Ihre App umfangreiche Farbfunktionen erfordert, müssen Sie Ihr Bereitstellungsziel auf iOS 9.3 oder höher ändern. Wenn Ihre App keine breite Farbfunktionalität erfordert und Sie sie auf älteren iOS-Versionen bereitstellen möchten, sollten Sie alle 16-Bit- oder P3-Assets durch 8-Bit-sRGB-Assets ersetzen. Sie können 16-Bit- oder P3-Assets finden, indem Sie "assetutil" im Asset-Katalog ausführen, der in der Fehlermeldung von iTunes Connect angegeben ist. Die folgenden Schritte beschreiben den Prozess:

  1. Erstellen Sie eine inspizierbare .ipa-Datei. Wählen Sie im Xcode Organizer (Xcode-> Fenster-> Organizer) ein zu prüfendes Archiv aus, klicken Sie auf "Exportieren ..." und wählen Sie "Für Unternehmens- oder Ad-hoc-Bereitstellung exportieren". Dadurch wird eine lokale Kopie des erstellt. IPA-Datei für Ihre App.

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

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

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

  5. Verwenden Sie das Suchwerkzeug, um Assets.car-Dateien in Ihrem .app-Bundle zu suchen, wie unten gezeigt: 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 unten gezeigt. ::sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json

  7. Untersuchen Sie die resultierende Datei /tmp/Assets.json und suchen Sie nach Inhalten, die "DisplayGamut": "P3" und den zugehörigen "Namen" enthalten. Dies ist der Name Ihres Imagesets, das ein oder mehrere 16-Bit- oder P3-Assets enthält.

  8. Ersetzen Sie diese Assets durch 8-Bit / sRGB-Assets und erstellen Sie dann Ihre App neu.

Update: Wenn Ihr Bereitstellungsziel auf 8.3 oder 8.4 festgelegt ist und Sie über einen Asset-Katalog verfügen, wird dieselbe Fehlermeldung angezeigt, auch wenn Sie nicht über 16-Bit- oder P3-Assets verfügen. In diesem Fall müssen Sie entweder Ihr Bereitstellungsziel auf 8.2 senken oder es auf 9.x verschieben.

Kostia Dombrovsky
quelle
2
Wie hängt das mit EXC_BAD_ACCESS zusammen?
Animaonline
1
Bitte duplizieren Sie keine Antworten. Kennzeichnen Sie Fragen stattdessen als Duplikate.
JAL
Danke mann! Mit dieser Antwort haben Sie mir eine Menge Zeit gespart! )
Thorax
3
In meinem Projekt (Bereitstellungsziel ist 8.0) gibt es noch keine P3-Assets. Ich bekomme einen Absturz in der App oder zufällig an einem beliebigen Ort mit xcode 8. Alle Assets sind 8-Bit / sRGB. Hat jemand noch mit dem gleichen Problem konfrontiert
Ankit
@Ankit wir stehen vor dem gleichen Problem. Haben Sie schon eine Lösung gefunden?
Roman Truba
32

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. Es hat mir geholfen:)

#!/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
quelle
Unsere Assets enthalten keine fehlerhaften Bilder, dennoch werden diese Fehler angezeigt.
Animaonline
@animaonline, Es hilft, wenn die App wirklich 16-Bit- oder P3-Assets enthält.
Aleksandr Terentev
2
Ich denke, das Hauptproblem ist, dass niemand tatsächlich bestätigt hat, dass dieser Fehler durch Vermögenswerte verursacht wird.
Animaonline
hat zuerst funktioniert, aber dann nicht, es stürzt einfach nicht am selben Ort ab
CiNN
1
Das Skript hat bei mir nicht funktioniert, aber mit ImageOptim
deej
16

Ich konnte das Problem reproduzieren und es scheint mit Bildern im Asset-Katalog zu tun zu haben. Fehler bei Apple behoben (mit angehängtem Beispielprojekt)

Apple Bug Reporter: 28371396

Evtim Georgiev
quelle
Ich kann das Beispielprojekt nicht herunterladen. Können Sie das Projekt teilen, um den Absturz zu reproduzieren
Tamil
Vielen Dank. Bei Problemen mit dem Asset-Katalog ändern Sie einfach den Farbraum von Adobe RGB (1998) in sRGB.
Timur Bernikovich
13

bearbeitetes Skript zum Konvertieren von PNG-Dateien in das richtige 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 "------------------------------"
Никита Конопелько
quelle
1
Dieses Skript ist etwas genauer. Спасибо, Никита.
Seelts
1
Das funktioniert wie ein Zauber. Einfaches aber effektives Skript. Für Leute, die nicht wissen, wie man dieses Skript ausführt. Schritte: 1) Fügen Sie dieses Skript in die txt-Datei ein und benennen Sie es in AssetsScript.sh um. 2) Gehen Sie zu Images.xcassets, der den Ordner einschließt, und behalten Sie die Skriptdatei bei in den Ordner, in dem Ihre Skriptdatei vorhanden ist 4) Ändern Sie die Berechtigungen für Skriptdateien in ausführbar (chmod 755 AssetsScript.sh). 5) Führen Sie die Skriptdatei mit Verzeichnisname als Parameter in der Befehlszeile selbst aus (./AssetsScript.sh Images.xcassets). Boom dies konvertiert alle Ihre Assets in das gewünschte Format und fertig. Die Anwendung funktioniert jetzt einwandfrei.
Srivathsa
In einer Zeile, 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)die nur 16-Bit-Bild in 8-Bit
konvertiert
3

gleicher Fehler.

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

in xcode

Klingeln
quelle
1
Was meinst du? Könnten Sie näher darauf eingehen?
Animaonline
1
Das Anzeigen eines Bildes mit dem Adobe RGB-Farbraum (1998) funktionierte für mich beim Debuggen auf einem Gerät mit Xcode 8 und Swift 3, war jedoch bei iOS 9 nicht verfügbar. Durch Ändern des Farbraums funktionierte es.
Andrew
1

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

Die App stürzte unter iOS 9.0 - iOS 9.2 bei scheinbar zufälligen / Storyboard-Übergängen / beim Festlegen eines UIImage (Name ...) ab. Dieser Thread wurde gefunden: ( https://forums.developer.apple.com/thread/61643 )

Wenn Ihre App auf iOS 8.4 abzielt, stürzt sie unter iOS 9.0 - 9.2 in Xcode 8 ab. Dies hat etwas mit xcassets zu tun. Durch Festlegen des Bereitstellungsziels auf 8.2 oder niedriger (ich habe 8.0 verwendet) wurde das Problem für mich behoben. Im Ernst. Der schlimmste Fehler aller Zeiten.

Karnett
quelle
Hallo. Hilfe! Ich erlebe so etwas, außer NUR im AppStore. Wenn ich meine App direkt auf einem iPhone mit iOS 9.2.1 erstelle, stürzt sie weder im Simulator noch im Simulator ab. Wenn ich jedoch genau dieselbe Version / denselben Build aus dem AppStore herunterlade, stürzt sie ab. War das auch bei Ihnen der Fall?
Sti
@Sti nein, es stürzte im Debug-Build ab. Verwenden Sie Kerndaten oder etwas anderes, das beim Überschreiben eines alten Builds ein Problem haben könnte? Nur ein Gedanke.
Karnett
Gute Gedanken, und ja, ich verwende Kerndaten in einigen Teilen der App. Aber nach vielen Tests bin ich mir ziemlich sicher, dass es nichts damit zu tun hat. Kerndaten haben nichts mit meinen Images zu tun, und fast alle meine Stack-Traces aus meinem Crash-Reporting-System besagen, dass UIImage (imageNamed :) der Böse ist. Oh, und das passiert auch bei Neuinstallationen. Über 7000 Abstürze in den letzten zwei Tagen, die nur iOS 9.0.2 bis 9.2.1 betreffen. Nicht iOS 9.3 oder höher. So seltsam. Und passiert nicht, wenn ich es jetzt baue. Nur AppStore. Debugging nicht möglich. Ich habe gerade ein TSI-Ticket an Apple gesendet.
Sti
Oh. Das ist eine klebrige. Hatte gerade einen anderen Gedanken. Welche Version von Swift verwendet die App Store-Version? Ich glaube, ich habe dies in Swift 2.2 oder 2.3 erlebt. Nicht Swift 3. Ich kann mir vorstellen, dass Sie jetzt mit Swift 3 bauen und es nicht reproduzieren können?
Karnett
Nein, aber es ist sehr interessant, dass Sie das sagen! Wir haben diese App schon lange im App Store. Die vorherige Version im App Store wurde in Swift 2.3 geschrieben und hat diesen Fehler nicht festgestellt. Diese neue Version im App Store, die ich vor einigen Tagen hochgeladen habe (die abstürzt), hat nur sehr wenige, aber sehr große Änderungen, einschließlich der Konvertierung in Swift 3. Eine weitere erwähnenswerte Änderung ist das Hinzufügen eines Widgets exklusiv für iOS 10.
Sti
0

Legen Sie das iOS-Bereitstellungsziel in Info fest Ihres Projekts und alle Ziele auf denselben Wert fest.

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

Jetzt funktioniert es perfekt.

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

Gustavo Barbosa
quelle
0

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

Ich habe festgestellt, dass dieses Problem bei Assets aufgetreten ist, die mithilfe eines lzfseAlgorithmus komprimiert wurden (Informationen zum Extrahieren von Informationen aus Assets.car finden Sie unter assetutil). Leider erlaubt Xcode IDE Entwicklern nicht, den Komprimierungsalgorithmus zu ändern. Sie können dies jedoch tun, indem Sie Assets manuell kompilieren und das Bereitstellungsziel im actoolBefehl senken .

tl; dr;

  1. Archiv
  2. Entpacken ipa
  3. Assets kompilieren - Sie können den von xcode generierten Asset Compiler-Befehl für Ihr Projekt 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. Klappe.
  2. Zurücktreten
badeleux
quelle