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

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



답변

허용 된 답변 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로 이동해야합니다.


답변

이 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 "------------------------------"


답변

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

애플 버그 리포터 : 28371396


답변

전체 프로젝트에서 공백이있는 올바른 형식으로 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 "------------------------------"


답변

같은 문제.

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

xcode에서


답변

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

앱이 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을 사용함) 문제가 해결되었습니다. 농담이 아닙니다. 최악의 버그.


답변

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

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

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

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