Awaria kompilacji Xcode 8 w systemie iOS 9.2 i starszym

85

Kiedy tworzę aplikację za pomocą Xcode 8 GM Seed i uruchamiam ją na urządzeniu z iOS 9.2 poniżej LUB na symulatorze, pojawiają się dziwne awarie EXC_BAD_ACCESS podczas uruchamiania aplikacji lub kilka sekund po uruchomieniu aplikacji. Awaria zawsze ma miejsce w innym miejscu (dodanie widoku podrzędnego, [UIImage imageNamed:]główna metoda delegata aplikacji itp.). Nie dostaję tych awarii, gdy uruchamiam go na iOS 9.3+ lub 10 i nie dostaję ich, gdy kompiluję z Xcode 7 i uruchamiam na iOS 9.2 i starszym . Czy ktoś jeszcze doświadczył czegoś podobnego? Czy to znany problem z Xcode 8?

Lingzhi Zhang
źródło
Najpierw zresetuj zawartość symulatora. i spróbuj ponownie.
Mehul
3
Czy byłeś w stanie rozwiązać swój problem? My też to mamy.
animaonline
Czy możesz zgłosić nowy błąd na bugreport.apple.com i załączyć przykładowy projekt oraz dzienniki awarii, abyśmy mogli to zbadać?
Quinn Taylor
@QuinnTaylor - Złożyłem raport o błędzie z załączonym projektem (odtworzony dla mnie w 100% w symulatorze) na bugreport.apple.com # 28371396. Dziękuję za przyjrzenie się temu!
Evtim Georgiev
3
@EvtimGeorgiev Thanks! Jest to duplikat błędu iOS związanego z obrazami P3 .png i powinien zostać naprawiony w pakiecie SDK iOS 10.1 beta zawartym w Xcode 8.1 beta, który został wydany dzisiaj. Czy możesz spróbować z tym budować?
Quinn Taylor

Odpowiedzi:

55

Zobacz zaakceptowaną odpowiedź https://forums.developer.apple.com/thread/60919

Możesz zapisać 16-bitowe zasoby jako 8-bitowe za pomocą Preview.app

Jak rozwiązać problem „BŁĄD ITMS-90682: nieprawidłowy pakiet - katalog zasobów pod adresem„ Ładunek / XXXXX / Assets.car ”nie może zawierać zasobów 16-bitowych ani P3, jeśli aplikacja obsługuje system iOS 8 lub starszy”.

W przypadku Xcode 8 GM ten błąd wystąpi, jeśli dołączysz zasoby 16-bitowe lub P3 do przesłanej aplikacji przeznaczonej na wersje iOS wcześniejsze niż iOS 9.3. Jeśli Twoja aplikacja wymaga szerokiej funkcjonalności kolorów, musisz zmienić cel wdrożenia na iOS 9.3 lub nowszy. Jeśli Twoja aplikacja nie wymaga szerokiej funkcjonalności kolorów i chcesz ją wdrożyć w starszych wersjach iOS, powinieneś zastąpić wszystkie zasoby 16-bitowe lub P3 8-bitowymi zasobami sRGB. Zasoby 16-bitowe lub P3 można znaleźć, uruchamiając „assetutil” w katalogu zasobów wymienionym w komunikacie o błędzie z iTunes Connect. Poniższe kroki opisują proces:

  1. Utwórz sprawdzalny plik .ipa. W Xcode Organizer (Xcode-> Window-> Organizer), wybierz archiwum do sprawdzenia, kliknij „Eksportuj…” i wybierz „Eksportuj do wdrożenia Enterprise lub Ad-Hoc”. Spowoduje to utworzenie lokalnej kopii pliku. ipa dla Twojej aplikacji.

  2. Znajdź ten plik .ipa i zmień jego rozszerzenie na .zip.

  3. Rozwiń plik .zip. Spowoduje to utworzenie folderu ładunku zawierającego pakiet .app.

  4. Otwórz terminal i zmień katalog roboczy na najwyższy poziom ścieżki cd pakietu .app / do / Payload / your.app

  5. Użyj narzędzia wyszukiwania, aby zlokalizować pliki Assets.car w pakiecie .app, jak pokazano poniżej: znajdź. -name „Assets.car”

  6. Użyj narzędzia assetutil, aby znaleźć dowolne zasoby 16-bitowe lub P3 w każdym Assets.car, który ma Twoja aplikacja, jak pokazano poniżej. :sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json

  7. Sprawdź wynikowy plik /tmp/Assets.json i poszukaj zawartości zawierającej „DisplayGamut”: „P3” i powiązaną z nim „Nazwę”. Będzie to nazwa Twojego zestawu obrazów zawierającego jeden lub więcej zasobów 16-bitowych lub P3.

  8. Zastąp te zasoby zasobami 8-bitowymi / sRGB, a następnie odbuduj aplikację.

Aktualizacja: Jeśli cel wdrożenia jest ustawiony na 8.3 lub 8.4 i masz katalog zasobów, otrzymasz ten sam komunikat o błędzie, nawet jeśli w rzeczywistości nie masz zasobów 16-bitowych lub P3. W takim przypadku będziesz musiał albo obniżyć cel rozmieszczenia do 8,2, albo przesunąć go do 9x.

Kostia Dombrovsky
źródło
2
Jak to się ma do EXC_BAD_ACCESS?
animaonline
1
Nie duplikuj odpowiedzi. Zamiast tego oznaczaj pytania jako duplikaty.
JAL
Dziękuje! Dzięki tej odpowiedzi zaoszczędziłeś mi mnóstwo czasu! )
Thorax
3
W moim projekcie (celem wdrożenia jest 8.0) nie ma zasobów P3, nadal dostaję awarię w aplikacji lub losowo w dowolnym miejscu z xcode 8. Wszystkie zasoby są 8-bitowe / sRGB. Czy ktoś nadal boryka się z tym samym problemem
Ankit
@Ankit mamy ten sam problem. Znalazłeś już rozwiązanie?
Roman Truba
32

Mam nadzieję, że ten skrypt bash może ci pomóc. Argumentem wejściowym jest katalog, który zawiera wszystkie xcassets twojego projektu. Ten skrypt ustawi profil sRGB na wszystkie pliki png. Pomogło mi :)

#!/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
źródło
Nasze zasoby nie zawierają żadnych wadliwych obrazów, ale nadal otrzymujemy te błędy.
animaonline
@animaonline, pomaga, jeśli aplikacja naprawdę zawiera zasoby 16-bitowe lub P3.
Aleksandr Terentev
2
Myślę, że głównym problemem jest to, że nikt tak naprawdę nie potwierdził, że ten błąd jest spowodowany aktywami.
animaonline
najpierw działał, ale potem nie, po prostu nie zawiesza się w tym samym miejscu
CiNN
1
Skrypt nie zadziałał dla mnie, ale użycie ImageOptim zadziałało
deej
16

Udało mi się odtworzyć problem i wydaje się, że jest on związany z obrazami w katalogu zasobów. Zgłoszono błąd w Apple (z załączonym przykładowym projektem)

Apple Bug Reporter: 28371396

Evtim Georgiev
źródło
Nie mogę pobrać przykładowego projektu. Czy możesz podzielić się projektem odtworzenia katastrofy
Tamil,
Dzięki. Problemy związane z katalogiem zasobów, wystarczy zmienić przestrzeń kolorów z Adobe RGB (1998) na sRGB.
Timur Bernikovich
13

edytowany skrypt do konwersji plików png do poprawnego formatu w całym projekcie i ze spacjami:

#!/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 "------------------------------"
Никита Конопелько
źródło
1
Ten skrypt jest trochę dokładniejszy. Спасибо, Никита.
seelts
1
To działa jak urok. Prosty, ale skuteczny skrypt. Dla osób, które nie wiedzą, jak uruchomić ten skrypt. Kroki: 1) Umieść ten skrypt w pliku txt i zmień jego nazwę na AssetsScript.sh 2) Przejdź do folderu zawierającego obrazy.xcassets i zachowaj plik skryptu 3) W wierszu poleceń idź do folderu, w którym istnieje plik skryptu 4) Zmień uprawnienia plików skryptów do pliku wykonywalnego (chmod 755 AssetsScript.sh) 5) wykonaj plik skryptu z parametrem nazwa_katalogu w wierszu poleceń (./AssetsScript.sh Images.xcassets). Boom to konwertuje wszystkie zasoby do wymaganego formatu i gotowe. Aplikacja będzie teraz działać poprawnie.
Srivathsa
W jednej linii, 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)która po prostu skonwertuje obraz 16-bitowy na 8-bitowy
DawnSong
3

ten sam problem.

Nie jestem pewien, czy to błąd, ale oto moje rozwiązanie: upewnij się, że zasoby obrazu nie zawierają przestrzeni kolorów Adobe RGB (1998)

w xcode

świst
źródło
1
Co masz na myśli? Czy mógłbyś to rozwinąć?
animaonline
1
Wyświetlanie obrazu z przestrzenią kolorów Adobe RGB (1998) działało dla mnie podczas debugowania na urządzeniu z Xcode 8 i Swift 3, ale nie było dostępne w wersji na iOS 9. Zmiana przestrzeni kolorów sprawiła, że ​​działało.
Andrew
1

Dodawanie dla kogokolwiek z podobnym problemem ...

Aplikacja ulegała awarii na iOS 9.0 - iOS 9.2 na czymś, co wydawało się przypadkowe / wokół przejść Storyboard / wokół ustawiania UIImage (nazwa ...) .. Znaleziono ten wątek: ( https://forums.developer.apple.com/thread/61643 )

Jeśli Twoja aplikacja jest przeznaczona dla systemu iOS 8.4, ulegnie awarii w systemie iOS 9.0 - 9.2 w Xcode 8 .. coś związanego z xcassets. Ustawienie celu wdrożenia na 8.2 lub mniej (użyłem 8.0) naprawiło to za mnie. Bez żartów. Najgorszy błąd w historii.

karnett
źródło
Cześć. Wsparcie! Doświadczam czegoś takiego, z wyjątkiem TYLKO w AppStore. Kiedy tworzę aplikację bezpośrednio na iPhonie z iOS 9.2.1, nie ulega awarii ani na symulatorze, ale kiedy pobieram dokładnie tę samą wersję / kompilację z AppStore, dochodzi do awarii. Czy tak było w przypadku ciebie?
Sti
@Sti nie, awaria w kompilacji debugowania. Czy używasz podstawowych danych lub czegokolwiek innego, co może mieć problem podczas nadpisywania starej kompilacji? Tylko myśl.
karnett
Dobra myśl i tak, używam podstawowych danych w niektórych częściach aplikacji. Ale po wielu testach jestem całkiem pewien, że nie ma to z tym nic wspólnego. Podstawowe dane nie mają nic wspólnego z moimi obrazami, a prawie wszystkie moje ślady stosu z mojego systemu raportowania awarii mówią, że UIImage (imageNamed :) to zły facet. Aha, i dzieje się to również w przypadku czystych instalacji. Ponad 7000 awarii w ciągu ostatnich dwóch dni, wpływając tylko na iOS 9.0.2 do 9.2.1 .. Nie na iOS 9.3 lub nowszy .. To dziwne. I nie dzieje się, gdy teraz go zbuduję. Tylko AppStore. Niemożliwe do debugowania. Właśnie wysłałem bilet TSI do Apple.
Sti
Ooh. To jest lepkie. Właśnie przyszła mi do głowy inna myśl… Której wersji Swift używa wersja ze sklepu z aplikacjami? Myślę, że doświadczyłem tego w Swift 2.2 lub 2.3. Nie Swift 3. Wyobrażam sobie, że tworzysz teraz Swift 3 i nie możesz go odtworzyć?
karnett
Nie, ale to bardzo interesujące, że to mówisz! Od dawna mamy tę aplikację w App Store. Poprzednia wersja w App Store została napisana w Swift 2.3 i nie wystąpił ten błąd. Ta nowa wersja z App Store, którą przesłałem kilka dni temu (ta, która się zawiesza) ma bardzo niewiele, ale bardzo duże zmiany, w tym konwersję do Swift 3. Inną godną uwagi zmianą jest dodanie widżetu wyłącznie dla iOS 10.
Sti
0

Ustaw cel wdrożenia systemu iOS w informacjach o projekcie i wszystkie cele na tę samą wartość.

W moim przypadku mój projekt był ustawiony na iOS 9.1, a cel został ustawiony na iOS 8.0 i zawieszał się na symulatorze z iOS 8.4

Teraz działa doskonale.

PS .: Wyczyść projekt przed ponownym uruchomieniem.

Gustavo Barbosa
źródło
0

Chociaż odpowiedź na pytanie została już udzielona, ​​zaakceptowane rozwiązanie nie działa dla mnie, ponieważ nie miałem żadnych zasobów 16b / ch.

Znalazłem ten problem w przypadku zasobów, które zostały skompresowane przy użyciu lzfsealgorytmu (można znaleźć informacje o kompresji wydobywającej informacje z Assets.car za pomocą assetutil). Niestety Xcode IDE nie pozwala programistom na zmianę algorytmu kompresji, jednak można to zrobić, kompilując zasoby ręcznie i obniżając cel wdrożenia w actoolpoleceniu.

tl; dr;

  1. Archiwum
  2. Rozsunąć suwak ipa
  3. Kompiluj zasoby - możesz znaleźć polecenie kompilatora zasobów dla swojego projektu wygenerowane przez xcode, sprawdzając dzienniki archiwalne w nawigatorze raportów Xcode

Przykładowe polecenie:

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. Zamknij się.
  2. Rezygnować
badeleux
źródło