Seung Hun

DALLE_2025-04-19_13.23.16_-_A_cartoon-style_square_image_of_a_software_developer_struggling_during_a_version_upgrade.The_character_is_drawn_in_a_friendly_clean_cartoon_style%28n.webp

xcode 16 버전 업그레이드 bitcode 문제 해결하기

회사에서 React Native를 사용하여 앱을 개발하는데 이번에 xcode 버전을 16으로 올리면서 겪은 트러블 슈팅을 공유하겠습니다.

에러 문구

Testflight로 배포 중 git action에서 다음과 같은 에러 문구가 나왔습니다.

[ContentDelivery.Uploader.600003100200] Validation failed (409) Invalid Executable. The executable 'Test.app/Frameworks/Test.framework/Test' contains bitcode. (ID: testidtestid)

에러에 대해서 구글링을 해보면 bitcode가 포함되어서 발생하는 에러라고 나옵니다.

Bitcode란 ?

images_wansook0316_post_e6a77286-6085-4cc2-98ad-f3c1ee29d8c6_Screen_Shot_2022-03-31_at_10.47.46_AM.png

Bitcode는 swift, objective c 코드를 컴파일 한 아키텍쳐에 종속적이지 않은 중간단계 코드입니다. 이런 중간 단계 코드를 만드는 이유는 ios의 여러 CPU 아키텍쳐에 맞춰서 앱을 컴파일 해야 하는데, bitcode가 없으면 각 환경에 맞는 기계어를 하나씩 컴파일 해야 하기 때문에 비효율적입니다.

기존에는 APP Store에 bitcode를 올리면 각각 디바이스 맞는 binary file을 주는 구조로 되어 있습니다.

xcode 16 bitcode deprecated

xcode가 16 버전이 되면서 bitcode는 deprecated가 되었습니다.

그래서 bitcode를 사용하는 의존성들도 버전 업그레이드를 해줘야 하는데, 버전을 올릴 때 발생하는 문제들을 대응 할 여유가 없어, 우선 bitcode만 제거하는 식으로 문제를 해결했습니다.

xcode ⇒ Build Phases로 이동하여 Delete Bitcode라는 스크립트를 추가합니다.

find "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -name '*.framework' -type d | while read -r framework; do framework_name=$(basename "$framework" .framework) binary_path="$framework/$framework_name" if xcrun otool -l "$binary_path" | grep -q __LLVM; then xcrun bitcode_strip -r "$binary_path" -o "$binary_path" fi done

그리고 For install build only 옵션을 체크 해야 합니다. 해당 옵션을 체크 하지 않으면 debug 앱을 빌드 할 때 서명 에러가 발생합니다. 참고로 위 스크립트는 .framework 내부의 바이너리에서 Bitcode가 포함된 경우 이를 제거하는 기능입니다.

stackover flow 글을 살펴보면 Podfile에 문제가 있는 framework paths를 지정하여 제거하는 방법이 있으나 하나씩 지정하는 게 번거롭고 유지 보수 차원에서 불편할 거 같아서 스크립트를 추가하는 방법으로 수정했습니다.