iOS 9.2 이하에서 Xcode 8 빌드 충돌


85

Xcode 8 GM Seed로 앱을 빌드하고 기기 또는 시뮬레이터 아래의 iOS 9.2에서 실행하면 앱 시작 중 또는 앱 시작 후 몇 초 후에 이상한 EXC_BAD_ACCESS 충돌이 발생합니다. 충돌은 항상 다른 지점에서 발생합니다 (서브 뷰 추가 [UIImage imageNamed:], 앱 델리게이트의 메인 메서드 등). iOS 9.3+ 또는 10에서 실행할 때 충돌이 발생하지 않으며 Xcode 7로 빌드 하고 iOS 9.2 이하 에서 실행할 때 충돌이 발생하지 않습니다 . 다른 사람이 비슷한 경험을 한 적이 있습니까? Xcode 8의 알려진 문제입니까?


먼저 시뮬레이터의 내용을 재설정합니다. 다시 시도하십시오.
Mehul

3
문제를 해결할 수 있었습니까? 우리도 그것을 가지고 있습니다.
animaonline

bugreport.apple.com에 새 버그를 신고하고 조사 할 수 있도록 샘플 프로젝트와 충돌 로그를 첨부 할 수 있습니까?
Quinn Taylor

@QuinnTaylor-bugreport.apple.com # 28371396에 첨부 된 프로젝트 (시뮬레이터에서 나를 위해 100 % 재현)와 함께 버그 보고서를 제출했습니다. 조사해 주셔서 감사합니다!
Evtim Georgiev

3
@EvtimGeorgiev 감사합니다! P3 .png 이미지와 관련된 iOS 버그의 복제물이며, 오늘 출시 된 Xcode 8.1 베타에 포함 된 iOS 10.1 베타 SDK에서 수정되어야합니다. 그것으로 구축해 볼 수 있습니까?
Quinn Taylor

답변:


55

허용 된 답변 https://forums.developer.apple.com/thread/60919 참조

Preview.app을 사용하여 16 비트 자산을 8 비트 자산으로 저장할 수 있습니다.

해결 방법 "오류 ITMS-90682 : 잘못된 번들- 'Payload / XXXXX / Assets.car'의 자산 카탈로그는 앱이 iOS 8 이하를 지원하는 경우 16 비트 또는 P3 자산을 포함 할 수 없습니다."

Xcode 8 GM의 경우 iOS 9.3 이전의 iOS 릴리스를 대상으로하는 앱 제출에 16 비트 또는 P3 자산을 포함하면이 오류가 발생합니다. 앱에 다양한 색상 기능이 필요한 경우 배포 대상을 iOS 9.3 이상으로 변경해야합니다. 앱에 와이드 컬러 기능이 필요하지 않고 이전 iOS 버전에 배포하려는 경우 모든 16 비트 또는 P3 자산을 8 비트 sRGB 자산으로 대체해야합니다. iTunes Connect의 오류 메시지에 이름이 지정된 자산 카탈로그에서 "assetutil"을 실행하여 16 비트 또는 P3 자산을 찾을 수 있습니다. 다음 단계는 프로세스를 간략하게 설명합니다.

  1. Inspectable .ipa 파일을 생성합니다. Xcode Organizer (Xcode-> Window-> Organizer)에서 검사 할 아카이브를 선택하고 "내보내기 ..."를 클릭 한 다음 "Enterprise 또는 Ad-Hoc 배포 용으로 내보내기"를 선택합니다. 이렇게하면. 앱용 ipa 파일.

  2. 해당 .ipa 파일을 찾아 확장자를 .zip으로 변경하십시오.

  3. .zip 파일을 확장하십시오. 그러면 .app 번들이 포함 된 페이로드 폴더가 생성됩니다.

  4. 터미널을 열고 작업 디렉터리를 .app 번들 cd 경로 /to/Payload/your.app의 최상위 수준으로 변경합니다.

  5. 찾기 도구를 사용하여 아래와 같이 .app 번들에서 Assets.car 파일을 찾습니다. find. -이름 'Assets.car'

  6. assetutil 도구를 사용하여 아래 표시된대로 애플리케이션에있는 각 Assets.car에서 16 비트 또는 P3 자산을 찾으십시오. :sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json

  7. 결과 /tmp/Assets.json을 검사하고 "DisplayGamut": "P3"및 관련 "이름"을 포함하는 내용을 찾습니다. 이것은 하나 이상의 16 비트 또는 P3 자산을 포함하는 이미지 세트의 이름입니다.

  8. 해당 자산을 8 비트 / sRGB 자산으로 바꾼 다음 앱을 다시 빌드하십시오.

업데이트 : 배포 대상이 8.3 또는 8.4로 설정되고 자산 카탈로그가있는 경우 실제로 16 비트 또는 P3 자산이없는 경우에도 이와 동일한 오류 메시지가 표시됩니다. 이 경우 배포 대상을 8.2로 낮추거나 9.x로 이동해야합니다.


2
이것이 EXC_BAD_ACCESS와 어떤 관련이 있습니까?
animaonline

1
답변을 중복하지 마십시오. 대신 질문을 중복으로 표시하십시오.
JAL

고마워요! 이 답변으로 나를 위해 많은 시간을 절약했습니다! )
흉부

3
내 프로젝트 (배포 대상 8.0)에는 여전히 P3 자산이 없습니다. 앱에서 충돌이 발생하거나 xcode 8을 사용하여 임의의 위치에서 무작위로 발생합니다. 모든 자산은 8 비트 / sRGB입니다. 아직이 같은 문제에 직면 사람나요
ANKIT

@Ankit 우리는 같은 문제에 직면하고 있습니다. 아직 해결책을 찾았습니까?
Roman Truba

32

이 bash 스크립트가 도움이되기를 바랍니다. 입력 인수는 프로젝트의 모든 xcasset을 포함하는 디렉토리입니다. 이 스크립트는 sRGB 프로필을 모든 png로 설정합니다. 그것은 나를 도왔습니다 :)

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

자산에 잘못된 이미지가 포함되어 있지 않지만 여전히 이러한 오류가 발생합니다.
animaonline

@animaonline, 앱에 실제로 16 비트 또는 P3 자산이 포함되어 있으면 도움이됩니다.
Aleksandr Terentev

2
가장 큰 문제는이 오류가 자산에 의해 발생한다는 사실을 아무도 실제로 확인하지 않았다는 것입니다.
animaonline 2011 년

처음에는 작동했지만 그렇지 않았습니다. 같은 장소에서 충돌하지 않습니다
CiNN

1
스크립트는 저에게 작동하지 않았지만 ImageOptim을 사용하면 작동했습니다
deej

16

문제를 재현 할 수 있었고 자산 카탈로그의 이미지와 관련된 것 같습니다. Apple에 버그 신고 (첨부 된 샘플 프로젝트 포함)

애플 버그 리포터 : 28371396


샘플 프로젝트를 다운로드 할 수 없습니다. 당신은 충돌 재현하는 프로젝트를 공유 할 수
타밀어

감사. 자산 카탈로그와 관련된 문제는 Adobe RGB (1998)에서 sRGB로 색상 공간을 변경하기 만하면됩니다.
Timur Bernikovich

13

전체 프로젝트에서 공백이있는 올바른 형식으로 png 파일을 변환하는 편집 된 스크립트 :

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

1
이 스크립트는 조금 더 정확합니다. Спасибо, Никита.
seelts

1
이것은 매력처럼 작동합니다. 간단하지만 효과적인 스크립트. 이 스크립트를 실행하는 방법을 모르는 사람들을 위해 .. 단계 : 1)이 스크립트를 txt 파일에 넣고 AssetsScript.sh로 이름을 바꿉니다. 2) 폴더를 포함하는 Images.xcassets로 이동하고 스크립트 파일을 유지합니다. 3) 명령 줄에서 이동 스크립트 파일이있는 폴더로 이동합니다. 4) 스크립트 파일 권한을 실행 파일 (chmod 755 AssetsScript.sh)로 변경합니다. 5) 명령 줄 자체 (./AssetsScript.sh Images.xcassets)에서 매개 변수로 directoryName을 사용하여 스크립트 파일을 실행합니다. Boom 이것은 모든 자산을 필요한 형식으로 변환하고 완료합니다. 이제 응용 프로그램이 제대로 작동합니다.
Srivathsa 2011

한 줄에 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), 16 비트 이미지를 8 비트로 변환합니다
DawnSong

3

같은 문제.

이것이 버그인지 확실하지 않지만 여기에 내 해결책이 있습니다. Adobe RGB (1998) 색상 공간없이 이미지 자산을 확인하십시오.

xcode에서


1
무슨 말이야? 자세히 설명해 주시겠습니까?
animaonline

1
Adobe RGB (1998) 색상 공간으로 이미지를 표시하는 것은 Xcode 8 및 Swift 3이 설치된 장치에서 디버그에서 저에게 효과가 있었지만 iOS 9에서는 릴리스되지 않았습니다. 색상 공간을 변경하면 작동했습니다.
Andrew

1

비슷한 문제가있는 다른 사람을 위해 추가하는 중 ...

앱이 iOS 9.0-iOS 9.2에서 무작위로 보였던 것 / 스토리 보드 전환 주변 / UIImage (name ...) 설정 주변에서 충돌했습니다.이 스레드를 찾았습니다 : ( https://forums.developer.apple.com/thread/61643 )

앱이 iOS 8.4를 대상으로하는 경우 Xcode 8의 iOS 9.0-9.2에서 충돌이 발생합니다. xcassets와 관련이 있습니다. 배포 대상을 8.2 이하로 설정하면 (8.0을 사용함) 문제가 해결되었습니다. 농담이 아닙니다. 최악의 버그.


안녕하세요. 도움! 나는 AppStore에서만을 제외하고 이와 같은 것을 경험하고 있습니다. iOS 9.2.1이 설치된 iPhone에서 직접 앱을 빌드 할 때 충돌이나 시뮬레이터에서 충돌하지 않지만 AppStore 에서 똑같은 버전 / 빌드를 다운로드하면 충돌이 발생합니다. 당신도 마찬가지 였나요?
Sti

@Sti 아니요, 디버그 빌드에서 충돌이 발생했습니다. 코어 데이터 또는 이전 빌드를 덮어 쓸 때 문제가 될 수있는 다른 것을 사용하고 있습니까? 그냥 생각.
karnett

좋은 생각, 네, 앱의 일부 부분에서 핵심 데이터를 사용하고 있습니다. 그러나 많은 테스트를 거친 후에 나는 그것이 그것과 아무 관련이 없음을 확신합니다. 핵심 데이터는 내 이미지와 관련이 없으며 내 충돌보고 시스템의 거의 모든 스택 추적에서 UIImage (imageNamed :)가 나쁜 사람이라고 말합니다. 아, 그리고 새로 설치할 때도 발생합니다. 지난 이틀 동안 7000 개가 넘는 충돌이 발생하여 iOS 9.0.2에서 9.2.1까지만 영향을 미칩니다 .. iOS 9.3 이상이 아닙니다 .. 그래서 이상합니다. 그리고 내가 지금 그것을 만들 때 일어나지 않습니다. AppStore 만. 디버깅이 불가능합니다. 방금 TSI 티켓을 Apple에 보냈습니다.
Sti

오. 끈적 끈적한 것입니다. 또 다른 생각이 있었어요 .. 앱 스토어 버전은 어떤 버전의 Swift를 사용하고 있나요? 나는 Swift 2.2 또는 2.3에서 이것을 경험했다고 생각합니다. Swift 3이 아닙니다. 지금 Swift 3으로 빌드하고 있는데 재현 할 수 없다고 생각하십니까?
karnett

아니요,하지만 당신이 그렇게 말하는 것은 매우 흥미 롭습니다! 우리는 오랫동안 App Store에서이 앱을 사용했습니다. App Store의 이전 버전은 Swift 2.3으로 작성되었으며이 버그가 발생하지 않았습니다. 내가 며칠 전에 업로드 한 App Store의이 새 버전 (크래시되는 버전)은 Swift 3으로 변환하는 것을 포함하여 매우 적지 만 매우 큰 변경 사항이 있습니다. 또 다른 언급 할 수있는 변경 사항은 iOS 10 전용 위젯 추가입니다.
Sti

0

프로젝트의 Info 내 에서 iOS 배포 대상 과 모든 대상을 동일한 값으로 설정합니다.

제 경우에는 프로젝트가 iOS 9.1 로 설정되었고 대상은 iOS 8.0 으로 설정 되어 iOS 8.4설치된 시뮬레이터에서 충돌이 발생했습니다.

이제 완벽하게 작동합니다.

추신 : 다시 실행하기 전에 프로젝트를 청소하십시오.


0

질문에 대한 답변은 이미 받았지만 16b / ch 자산이 없었기 때문에 accepeted 솔루션이 작동하지 않습니다.

lzfse알고리즘을 사용하여 압축 된 자산에 대해 문제가 발생했음을 발견했습니다 (를 사용하여 Assets.car에서 정보를 추출하는 압축에 대한 정보를 찾을 수 있음 assetutil). 불행히도 Xcode IDE는 개발자가 압축 알고리즘을 변경하는 것을 허용하지 않지만 수동으로 자산을 컴파일하고 actool명령 에서 배포 대상을 낮추면이를 수행 할 수 있습니다 .

tl; dr;

  1. 아카이브
  2. 압축 해제 ipa
  3. 자산 컴파일-Xcode 보고서 탐색기 에서 아카이브 로그를 확인하여 xcode에서 생성 한 프로젝트에 대한 자산 컴파일러 명령을 찾을 수 있습니다.

예제 명령 :

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. 그것을 압축하십시오.
  2. 사임
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.