Addressables LoadPath, Xcode 16 CocoaPods, fastlane 서명 문제 정리
Addressables Runtime.LoadPath가 빌드 환경에 고정되는 문제
섹션 제목: “Addressables Runtime.LoadPath가 빌드 환경에 고정되는 문제”앱은 원빌드로 여러 서버 환경(DEV, QA, REVIEW 등)에 접속할 수 있다. 진입 페이지를 거쳐 실행하면 실행 인자로 환경을 바꿀 수 있고, 이를 통해 대상 API나 S3 목적지를 선택적으로 바꿔 확인한다.
로컬라이징 콘텐츠가 추가되면서 Addressables 시스템을 도입했다.
Addressables는 빌드 시점에 로드 경로를 명시적으로 지정해야 한다.
AddressableAssetSettingsDefaultObject.Settings.profileSettings.SetValue(profileId, "Runtime.LoadPath", runtimeLoadpath);하나의 profileId에 경로를 지정하고 빌드가 그 값을 계속 참조하는 구조다. profileId를 여러 개 만들어도 빌드 시점에는 하나만 참조할 수 있어서, 런타임에 경로를 환경별로 바꾸기가 어렵다.
그래서 빌드 환경과 접속 환경이 다르면(예: QA 빌드로 DEV 환경 접속) Addressables를 쓰는 콘텐츠에서 음성 리소스 로드가 실패한다.
광고 SDK 환경별 설정값 불일치
섹션 제목: “광고 SDK 환경별 설정값 불일치”Adiscope 광고 SDK와 통신하려면 매체 id와 secret 값이 필요하다. 이 값이 클라이언트, 광고 매체, API 서버 사이에 제대로 공유되지 않아 DEV 환경에서 문제가 생겼다.
클라이언트는 이 값을 두 시점에서 결정한다.
- 빌드 시점: 환경별 설정 JSON을 프로젝트에 두고, 빌드 전처리 단계에서 현재 환경의 JSON을 SDK 설정으로 가져온다.
- 런타임 시점: 광고 SDK 매니저 초기화 시점에 환경별 id·secret으로 SDK를 초기화한다.
빌드 전처리 구현은 별도 문서(“IPreprocessBuildWithReport로 광고 SDK 환경 설정 자동화”)에 정리했다.
Xcode 16 업데이트 후 CocoaPods 호환
섹션 제목: “Xcode 16 업데이트 후 CocoaPods 호환”Xcode 16 빌드가 강제되는 일정에 맞춰 빌드 머신의 Xcode를 16.3으로 올렸다. 이후 Unity iOS 빌드는 성공해 xcodeproj까지 만들어지지만 pod install이 실패해 workspace가 생성되지 않았다.
Xcode만 올리고 CocoaPods를 업데이트하지 않아 호환성 문제가 생겼다.
CocoaPods를 최신으로 올리고 spec 저장소를 갱신했다.
pod --versionsudo gem install cocoapodspod repo updatepod install배운 점
섹션 제목: “배운 점”처음에는 workspace 없이 xcodeproj로 직접 아카이빙해 보다가 AppsFlyer.h 헤더가 없다는 에러를 보고 AppsFlyer Unity SDK를 업데이트하면 된다고 잘못 판단했다. 실제 원인은 CocoaPods였다. 다만 이 과정에서 AppsFlyer Unity 플러그인 최신 릴리스(v6.16.0)를 적용하려면 Android 쪽에서 Unity 또는 Gradle 업데이트가 필요하다는 사실을 미리 알 수 있었다.
fastlane lane 안정화
섹션 제목: “fastlane lane 안정화”.ipa를 빠르게 올리기 위해 만든 lane이 간헐적으로 실패해 정리했다.
rbenv 환경 변수 문제
섹션 제목: “rbenv 환경 변수 문제”rbenv detected, removing env variablesrbenv: shell integration not enabled. Run `rbenv init' for instructions.빌드 머신의 zsh에 Ruby 환경 변수를 설정했는데도 Jenkins나 fastlane 실행 환경에서 간헐적으로 rbenv가 초기화되지 않았다.
before_all에서 매 lane 실행 전에 rbenv를 초기화하도록 했다.
before_all do puts "🚀 START FASTLANE !" # 모든 lane 실행 전에 rbenv 초기화 (에러 발생 시 Fastlane 종료 방지) sh("eval \"$(rbenv init -)\" || true")endXcode 로그인이 풀려 배포 인증서를 못 찾는 문제
섹션 제목: “Xcode 로그인이 풀려 배포 인증서를 못 찾는 문제”error: exportArchive No signing certificate "iOS Distribution" founderror: exportArchive No AccountsXcode 업데이트 후 로그인이 풀리면 배포 인증서가 없다는 에러로 실패했다.
키체인에 개인 계정으로 묶여 있던 업로드 계정 설정을 팀 공용 계정으로 바꾸고, 빌드 머신에서 자동 로그인되도록 했다. 기존 개인 계정은 키체인에서 지웠다.
그 뒤에도 빌드가 옛 계정을 찾았는데, 원인은 fastlane Appfile에 남아 있던 계정 정보였다. Appfile의 계정도 공용 계정으로 바꾸고 빌드가 정상 처리되는 것을 확인했다.
자동 서명 옵션이 간헐적으로 꺼지는 문제
섹션 제목: “자동 서명 옵션이 간헐적으로 꺼지는 문제”자동 서명 옵션이 의도대로 동작하지 않는 경우가 간헐적으로 있었다. App Group 적용 이후부터라고 의심하지만 확인하지 못했다. lane의 빌드 단계에서 서명 방식을 강제로 automatic으로 지정했다.
export_options: { allowProvisioningUpdates: true, # 자동 프로비저닝 업데이트 허용 signingStyle: "automatic", # 자동 코드 서명 방식 사용},xcargs: "-allowProvisioningUpdates" # Xcode에서 프로비저닝 업데이트 허용정리한 Fastfile
섹션 제목: “정리한 Fastfile”이전 프로젝트부터 쓰던 Fastfile을 정리하고 주석을 달았다.
default_platform(:ios)
platform :ios do before_all do puts "🚀 START FASTLANE !" # 모든 lane 실행 전에 rbenv 초기화 (에러 발생 시 Fastlane 종료 방지) sh("eval \"$(rbenv init -)\" || true") end
lane :beta do |options|
# ✅ 자동 코드 서명 설정 (Xcode 프로젝트의 팀 ID를 설정) update_code_signing_settings( use_automatic_signing: true, # 자동 서명 활성화 team_id: "<TEAM_ID>" # 애플 개발자 계정의 Team ID (Apple Developer 계정에서 확인 가능) )
# ✅ 빌드 번호 자동 증가 (TestFlight에 업로드된 최신 버전 확인 후 +1 증가) increment_build_number( build_number: latest_testflight_build_number(version: options[:version]) + 1, xcodeproj: "Unity-iPhone.xcodeproj" )
# ✅ Xcode 버전 16.3을 빌드에 사용하도록 설정 (xcodes 플러그인 필요) xcodes( version: '16.3', select_for_current_build_only: true, )
# ✅ 앱 빌드 수행 (export_options에서 코드 서명 관련 설정 추가) build_app( workspace: "Unity-iPhone.xcworkspace", # Xcode 프로젝트의 workspace scheme: "Unity-iPhone", # Xcode 프로젝트의 scheme export_options: { allowProvisioningUpdates: true, # 자동 프로비저닝 업데이트 허용 signingStyle: "automatic", # 자동 코드 서명 방식 사용 }, output_directory: "./build", # 빌드된 .ipa 파일 저장 경로 output_name: "#{options[:name]}.ipa", # 빌드된 .ipa 파일 이름 (options 값 활용) xcargs: "-allowProvisioningUpdates" # Xcode에서 프로비저닝 업데이트 허용 )
# ✅ TestFlight에 빌드 업로드 (업로드할 .ipa와 변경 로그 포함) upload_to_testflight({ changelog: File.read("./Changelog.txt"), # 변경 사항이 담긴 Changelog.txt 파일을 읽어 changelog로 사용 ipa: "./build/#{options[:name]}.ipa" # 위에서 빌드한 .ipa 파일을 업로드 }) endend