iOS ITMS-90725 이슈 및 Bitcode 포함 에러 해결

부리부리대마왕·2025년 4월 29일
0

🍎 Overview

최근 들어서 iOS 앱을 App Store Connect에 업로드 할 때 마다 업로드 한 앱에 문제가 있다고 메일이 왔다. 내용을 보아하니 SDK 버전 이슈인 것 같아서, 좀 덜 바쁠 때 처리하려고 했다.(뭔가 한 번에 성공할 것 같지도 않았음..)

2025년 4월 24일 부터 iOS, iPadOS 는 필수적으로 iOS SDK 18 버전 이상으로 빌드해서 업로드를 해야 한다고 한다. SDK 버전 관련 문서를 찾아보니, Xcode 16버전 이상부터 SDK 18을 포함하기 때문에 일단은 아카이빙 하는 Xcode 의 버전을 먼저 확인해봤다.


Q1. Xcode 버전과 iOS SDK 버전은 어떤 관계인지?

Xcode는 항상 특정 버전의 iOS SDK를 포함하고 있다. 예를 들어, Xcode 16.2에는 iOS SDK 18.2버전이 내장되어 있고, Xcode 15.2 에는 iOS SDK 17.2버전이 내장되어 있다.

즉, Xcode는 자체적으로 특정 iOS SDK를 내장하고 있기 때문에, Xcode 버전은 사용할 수 있는 iOS SDK 버전을 결정한다.


Q2. Xcode가 어떤 iOS SDK를 포함하는지 확인하는 방법

xcodebuild -version -sdk

이미지를 보면, 내 로컬은 Xcode 16.2 버전을 사용중이다.


Q3. App Store Connect에서 iOS SDK 버전으로 경고를 주는 이유?

새로운 OS 기능을 활용하고, 보안성을 확보하기 위해 최신 SDK(최신 Xcode)로 빌드하도록 강제한다.



✍️ 원인 파악

로컬 Xcode 버전 확인

내 앱은 App Store Connect 업로드를 Github Action을 통해 하고 있었으므로, 로컬의 Xcode, MacOS 버전과는 관계가 없었다.


Github Action Workflow 확인

runs-on: macos-latest
  • Github Action Workflow를 확인해보니, App Store Connect 에 업로드 하는 job 은 macos-latest 환경을 사용해 앱을 빌드하고 있었다.
  • Github Runner Images 공식 문서 를 확인해보면, 현재 macos-latest 는 macOS 14 버전을 바라보고 있다.
  • 그리고 Github Action macOS 14 관련 문서 를 확인해보면, macos-latest(macOS 14)는 Xcode 15.4 버전을 Default 로 보고있다.
  • 따라서 Action 에서 사용하는 macOS 환경을 Xcode 16.0버전 이상을 지원하는 환경으로 변경해야 한다.



🍞 해결 과정

1. Github Action 워크플로우 수정

runs-on: macos-15

macos-latest(14 기준 타겟) 에서 15로 변경한다.


2. Bitcode 에러 발생

버전을 변경하고 다시 App Store Connect 업로드를 시도해보니, Bitcode 관련 에러가 발생했다.에러 내용은, 특정 Framework 바이너리가 Bitcode를 포함하고 있다고 한다. 도대체 이게 무슨 소리인지 이해가 안돼서 구글링을 해봤다.

⚠️ Xcode 15부터는 완전히 Deprecated 되었고, Xcode 16부터는 Bitcode가 포함된 바이너리는 업로드조차 막음.

구글링을 해보니, Xcode 16 부터는 Bitcode 를 포함하는 바이너리는 App Store Connect 업로드를 허용하지 않는다고 한다. 그리고 공식 문서를 보면, 이미 Xcode 15부터는 Bitcode관련 지원이 중단되었다고 작성되어 있다.


Bitcode 란?

Apple 에서 도입한 중간(intermediate) 컴파일 코드 우리가 작성한 Swift/Objc 코드가 기계어로 변환되지 않고, 중간 단계의 형태로 컴파일 된 것

[소스코드]
   ↓ (프론트엔드 컴파일러: Swift / Clang 등)
[중간 표현 = Bitcode (LLVM IR)]
   ↓ (백엔드 컴파일러: LLVM)
[기계어 = 최종 바이너리]

애플은 여러 디바이스에 대해 최적화된 컴파일을 하기 위해 Bitcode를 받아서 각 아키텍처에 맞는 컴파일을 수행했다고 한다. 근데 현재는 갖가지 이유로 사용되지 않기 때문에 Apple은 Bitcode를 Deprecated시켰다.


3. Bitcode 제거

3rd party 라이브러리를 사용하는 경우, 직접 패키지 수정을 할 수 없기 때문에 Pod 설치 시 바이너리에서 Bitcode를 제거하는 방법으로 처리해야 한다.

3-1. Bitcode 제거 명령어 확인

xcrun bitcode_strip <Framework 바이너리 경로> -r -o <Framework 바이너리 경로>
  • xcrun: Xcode 에서 제공하는 CLI 도구 중 하나이다.
  • bitcode_strip: 바이너리 내부에 포함된 bitcode segment 를 제거하는 명령어
  • - r: remove 옵션
  • - o [path]: 출력 파일의 경로를 지정하는 옵션

3-2. Bitcode 가 포함된 Framework 및 경로 확인

에러 메세지를 보면, TwitterCore, TwitterKit 두 Framework 가 문제인 걸 확인할 수 있다. 일단 해당 프레임워크들의 Bitcode 를 지우기 위해선, Framework의 바이너리 위치를 찾아야 한다. 바이너리는 ios/Pods/<framework_name> 하위에서 찾을 수 있다.

xcrun bitcode_strip <path> -r -o <path>

// ex) <path> = Pods/TwitterCore/iOS/TwitterCore.framework/TwitterCore

찾은 경로가 맞는지 확인해보기 위해, 직접 Bitcode 제거 명령어를 로컬에서 실행해보자. 만약 경로가 올바르지 않을 경우, no such file ... 에러가 발생한다.


3-3. Podfile 작성

post_install do |installer|
  twitter_binaries = [
    {
      name: 'TwitterCore',
      path: 'Pods/TwitterCore/iOS/TwitterCore.framework/TwitterCore'
    },
    {
      name: 'TwitterKit5',
      path: 'Pods/TwitterKit5/iOS/TwitterKit.framework/TwitterKit'
    }
  ]

  installer.generated_projects.each do |project|
    project.targets.each do |target|
    
      # 🔍 Bitcode 제거
      twitter_binaries.each do |binary|
	      
	    # Bitcode를 없앨 바이너리만 확인
        if target.name == binary[:name]
          puts "🔧 Stripping bitcode from #{binary[:name]}"
          
          # 절대 경로로 변경
          framework_path = File.expand_path(binary[:path])
          
          if File.exist?(framework_path)
            system("xcrun --sdk iphoneos bitcode_strip -r #{framework_path} -o #{framework_path}")
            puts "🔧 Stripped bitcode from #{binary[:name]}"
          else
            puts "⚠️  Not found: #{framework_path}"
          end
        end
      end
    end
  end
end

Pod 설치 시 바이너리의 Bitcode를 제거하는 작업 추가했다. Framework 바이너리를 잘 찾고, 명령어를 잘 수행했는지 보기 위한 로그도 중간에 넣어주었다.


3-4. pod install

먼저 로컬에서 pod install 명령어로 Bitcode제거 명령어가 수행되었는지 확인하고(시간 아끼려고), 잘 동작 하면 다시 Archive 후 App Store Connect 에 업로드를 시도해본다.



🍺 결과

Github Action 배포 환경을 macOS 15, Xcode 16로 변경하고 App Store Connect 업로드에 성공했다. 사용하는 Framework들이 Bitcode 가 제거 된 상태로 업데이트 되면 좋겠지만, 오래된 패키지들은 업데이트가 되지 않아서 직접 Framework를 타겟팅을 해서 Bitcode 를 지워줘야 하는 불편함이 있었다.



참조

0개의 댓글