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.appex가Copy Files와Embed App Extensions두 빌드 페이즈에 등록됨 - Stale Closure:
handleWidgetPause/handleWidgetResume에서 클로저 캡처된workoutState가 최신 값 반영 못함 - Native 언어 동기화 누락:
i18n 언어 변경 시
LocationTracker,WorkoutSessionManager에 알림 없음
해결 과정
-
서명 설정 수정 (app.plugin.js):
CODE_SIGN_IDENTITY = '"-"'로 변경하여 Xcode 자동 관리- 메인 앱 타겟과 LiveActivity 타겟 모두 적용
-
중복 빌드 페이즈 제거 (app.plugin.js):
Copy Files페이즈에서LiveActivity.appex자동 제거 로직 추가Embed App Extensions페이즈만 유지
-
클로저 버그 수정 (run/index.tsx):
workoutState→workoutStateRef.current사용- 항상 최신 상태 참조하도록 변경
-
언어 동기화 추가 (i18n/index.ts, Native):
updateLanguage메서드로 Native 모듈에 언어 변경 알림- UserDefaults 동기화로 위젯에서도 언어 반영
배운 점 및 회고
- Automatic Signing: Xcode Automatic signing 사용 시
CODE_SIGN_IDENTITY를 직접 지정하면 안됨.-로 설정하거나 생략해야 함 - Expo Plugin 디버깅:
npx expo prebuild --clean후project.pbxprojgrep으로 중복 확인하는 패턴 유용 - React 클로저: 이벤트 핸들러에서 상태 참조 시
useRef로 최신 값 유지 필수 - 느낀 점: Native-JS 간 상태 동기화는 항상 양방향 검증 필요. 한쪽만 수정하면 반대쪽에서 버그 발생