본문으로 건너뛰기

iOS 빌드 서명 및 위젯 중복 등록 트러블슈팅

·3 min read

문제 상황

  • EAS Production 빌드 시 LiveActivity has conflicting provisioning settings 에러 발생
  • Unexpected duplicate tasks 에러로 Archive 실패
  • 위젯-앱 간 일시정지/재개 상태 동기화 버그
  • 러닝 중 언어 변경 시 음성 안내에 반영 안됨

원인 분석

  • 서명 설정 충돌: CODE_SIGN_STYLE = 'Automatic'으로 설정하면서 CODE_SIGN_IDENTITY = 'iPhone Distribution'을 수동 지정하여 Xcode가 충돌 감지
  • appex 중복 등록: LiveActivity.appexCopy FilesEmbed App Extensions 두 빌드 페이즈에 등록됨
  • Stale Closure: handleWidgetPause/handleWidgetResume에서 클로저 캡처된 workoutState가 최신 값 반영 못함
  • Native 언어 동기화 누락: i18n 언어 변경 시 LocationTracker, WorkoutSessionManager에 알림 없음

해결 과정

  1. 서명 설정 수정 (app.plugin.js):

    • CODE_SIGN_IDENTITY = '"-"'로 변경하여 Xcode 자동 관리
    • 메인 앱 타겟과 LiveActivity 타겟 모두 적용
  2. 중복 빌드 페이즈 제거 (app.plugin.js):

    • Copy Files 페이즈에서 LiveActivity.appex 자동 제거 로직 추가
    • Embed App Extensions 페이즈만 유지
  3. 클로저 버그 수정 (run/index.tsx):

    • workoutStateworkoutStateRef.current 사용
    • 항상 최신 상태 참조하도록 변경
  4. 언어 동기화 추가 (i18n/index.ts, Native):

    • updateLanguage 메서드로 Native 모듈에 언어 변경 알림
    • UserDefaults 동기화로 위젯에서도 언어 반영

배운 점 및 회고

  • Automatic Signing: Xcode Automatic signing 사용 시 CODE_SIGN_IDENTITY를 직접 지정하면 안됨. -로 설정하거나 생략해야 함
  • Expo Plugin 디버깅: npx expo prebuild --cleanproject.pbxproj grep으로 중복 확인하는 패턴 유용
  • React 클로저: 이벤트 핸들러에서 상태 참조 시 useRef로 최신 값 유지 필수
  • 느낀 점: Native-JS 간 상태 동기화는 항상 양방향 검증 필요. 한쪽만 수정하면 반대쪽에서 버그 발생