진짜 개억까 이슈: Undefined symbol: __swift_FORCE_LOAD_$_swiftCompatibility56
테스트만 200번 했는데 번들 ID 바꾸니까 터진다고? 이게 말이 되나?
아니, 오늘 쉬는 날이었다
원래 오늘은 쉬는 날이었다.
친구랑 신나게 체육관에 가서 샌드백을 치고 있었다.
그런데 수원국에서 “개발자님, 요청하신 Apple 계정 권한 드렸습니다 ^^” 하고 연락이 왔다.
몇 주 동안 달라고 요청할 때는 묵묵부답이더니, 왜 하필 오늘인가.
그래도 일은 해야 했다.
찝찝함을 남기기 싫어 얼른 처리하고 쉬자는 생각이었다.
받은 계정으로 변경하고, Bundle ID를 수정하고, Archive 버튼을 눌렀다.
빌드가 터졌다.
Undefined symbol: __swift_FORCE_LOAD_$_swiftCompatibility56
이해가 되지 않았다.
나는 코드를 건드린 것이 아니다. 단지 계정과 ID만 바꾸었을 뿐이다.
로컬에서 빌드 테스트만 200번은 넘게 돌렸던 프로젝트였다.
그런데 갑자기 터진다는 것이 말이 되는가?
정말 어이가 없었다.
xCode, 생각이란 게 없는 건가
로그를 확인해 보니 상황은 더욱 가관이었다.
lottie-ios, react-native-maps 등 어제까지 잘 돌아가던 라이브러리들이었다.
갑자기 Undefined symbol이라며 심볼을 찾지 못하겠다고 했다.
구글링을 통해 확인한 원인은 기가 막혔다.
네이티브 모듈은 Swift를 사용하지만, 메인 프로젝트에는 Swift 파일이 없어 Xcode가 Swift 런타임을 제외해 버린 것이었다.
그렇다면 여태까지 200번 빌드할 때는 왜 포함시켜 주었는가?
계정을 바꾸고 클린 빌드(Clean Build)를 수행하니 그제야 “이 프로젝트는 Swift를 안 쓰네? 제외한다.” 하고 최적화를 돌린 것인가?
애플의 이 선택적 똑똑함에 혀를 내두를 수밖에 없었다.
개발자를 괴롭히는 기능이 탑재된 것이 분명하다.
해결: 이게 맞나 싶지만 일단 해결했다
해결 방법 또한 코미디였다.
Xcode에게 이 프로젝트는 Swift를 쓰니까 런타임을 제외하지 마라라고 시위하기 위해 빈 Swift 파일을 하나 만들어야 했다.
(1) 공갈 파일 생성
File.swift를 하나 생성했다. 내용은 없다. 빈 껍데기일 뿐이다.- 생성 시 Bridging Header를 만들까요?라고 물어보면 반드시 생성을 선택해야 했다.
이 과정을 거치면 Xcode가 “아, 이 프로젝트는 Swift를 사용하는구나”라고 인식하여 런타임을 다시 포함시켜 준다.
이것이 2026년 최첨단 IDE의 수준이라니 믿기지 않았다.
(2) 경로 문제로 인한 추가 삽질
급한 마음에 스크립트를 돌려 파일을 추가했는데, 이번에는 경로를 찾지 못한다고 에러를 뱉었다.
스크립트는 ios/File.swift를 참조하는데 실제 파일은 ios/App_name/File.swift에 생성되어 있었다.
파일 위치를 옮기니 거짓말처럼 빌드에 성공했다.
결론
권한을 늦게 준 발주처, 멍청하게 똑똑한 Xcode, 그리고 삭제된 나의 휴일.
환상의 삼위일체였다.
아직도 이해가 가지 않는다.
코드 한 줄 고치지 않고 ID만 바꾸었는데 왜 런타임이 빠지는지 말이다.
캐시 문제였는지, 아니면 Xcode가 주인이 바뀐 것을 눈치채고 텃세를 부린 것인지 알 수 없다.
어찌 되었든 빈 파일 하나를 던져주니 해결은 되었다.
아오, 꼭 쥐뿔도 아닌게 발목을 잡는다.
마침.