IT story

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

hot-time 2020. 9. 16. 20:59
반응형

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 path / 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"및 관련 "Name"을 포함하는 내용을 찾습니다. 이는 하나 이상의 16 비트 또는 P3 자산이 포함 된 이미지 세트의 이름입니다.

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

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


이 bash 스크립트가 도움이되기를 바랍니다. 입력 인수는 프로젝트의 모든 xcassets를 포함하는 디렉토리입니다. 이 스크립트는 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 "------------------------------"

I was able to reproduce the problem and it does seem related to images in Asset Catalog. Filed a bug with Apple (with attached sample project)

Apple Bug Reporter: 28371396


edited script to convert png files to correct format in whole project and with white spaces:

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

same issue.

I'm not sure if this is a bug but here is my solution : make sure your image assets without Adobe RGB (1998) colorspace

in xcode


Adding for anyone else with a similar problem...

App was crashing on iOS 9.0 - iOS 9.2 on what seemed random / around Storyboard transitions / around setting an UIImage(name...).. Found this thread: (https://forums.developer.apple.com/thread/61643)

If your app is targeting iOS 8.4, it will crash on iOS 9.0 - 9.2 in Xcode 8.. something to do with xcassets. Setting the deployment target to 8.2 or below ( I used 8.0) fixed it for me. No kidding. Worst bug ever.


Set the iOS Deployment Target inside Info of your project and all the targets to the same value.

In my case my Project was set to iOS 9.1 and the Target was set to iOS 8.0 and was crashing on Simulator with iOS 8.4

Now it's working perfectly.

PS.: Clean the project before running again.


Although question has been already answered, accepeted solution doesn't work for me, as I didn't have any 16b/ch assets.

I found that issue appeared for assets which were compressed using lzfse algorithm (you can find information about compression extracting info from Assets.car using assetutil). Unfortunately Xcode IDE doesn't allow developers to change compression algorithm, however you can do that by compiling assets manually and lowering deployment target in actool command.

tl;dr;

  1. Archive
  2. Unzip ipa
  3. Compile assets - You can find asset compiler command for your project generated by xcode by checking archive logs in Xcode report navigator

Example command:

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. Zip it.
  2. Resign

참고URL : https://stackoverflow.com/questions/39404285/xcode-8-build-crash-on-ios-9-2-and-below

반응형