EDM4U iOS Resolver 설정이 프로젝트마다 달라야 하는 이유
같은 EDM4U iOS Resolver를 쓰는 두 Unity 프로젝트에서 최적 설정이 서로 달랐다. 한 프로젝트의 설정을 다른 프로젝트에 그대로 옮기면 빌드나 런타임에 문제가 생긴다. 실제로 Facebook SDK를 쓰는 프로젝트에서 iOS Firebase Analytics 이벤트가 수집되지 않는 빌드 설정 문제가 있었다.
관련 옵션
섹션 제목: “관련 옵션”- Swift Workaround: Unity가 생성한 Xcode 프로젝트에 가짜 Swift 파일을 하나 넣어 Xcode가 Swift 프로젝트로 인식하게 한다. Facebook SDK 구동에 필요한 Swift 라이브러리를 강제로 포함시키는 옵션이다.
- Always add main target to Podfile: CocoaPods 라이브러리를
UnityFramework뿐 아니라 메인 앱 타깃(Unity-iPhone)에도 강제로 추가한다. 켜면 같은 라이브러리가 양쪽에서 로드되어 중복 충돌이 날 수 있다.
프로젝트별 설정 비교
섹션 제목: “프로젝트별 설정 비교”| 설정 항목 | 게임 A (Facebook SDK 사용) | 게임 B | 일치 여부 |
|---|---|---|---|
| Podfile Generation | ON | ON | 일치 |
| Use Shell to Execute… | ON | ON | 일치 |
| Auto Install Cocoapod Tools in Editor | ON | ON | 일치 |
| Add use_frameworks! | ON | ON | 일치 |
| Link frameworks statically | OFF | OFF | 일치 |
| Always add main target to Podfile | OFF | ON | 불일치 |
| Allow same pod to be in multiple targets | ON | ON | 일치 |
| Swift Workaround | ON | OFF | 불일치 |
Facebook SDK를 쓰는 게임 A는 Swift가 필수라 Swift Workaround를 켜야 한다. 여기서 Always add main target까지 켜면 같은 Pod이 UnityFramework와 메인 앱 타깃(Unity-iPhone) 양쪽에 링크된다. 실행 로그에 Class X is implemented in both ... 경고가 찍히고, Firebase는 Attempted to register protocol FIRAnalyticsInterop, but it already has an implementation처럼 같은 구현을 두 번 등록하려 한다. 어느 쪽 구현이 쓰일지 정해지지 않아 Analytics 이벤트가 빠지거나 앱이 죽는다. 그래서 게임 A는 Always add main target을 꺼야 했다. AppLovin 지원 문서와 EDM4U 이슈도 같은 증상에 이 옵션을 끄라고 안내한다.
- https://support.applovin.com/en/max/faq/unity-ios-podfile-issues
- https://github.com/firebase/quickstart-unity/issues/1071
Facebook SDK의 에디터 스크립트는 이 옵션과 별개로 Podfile에 target 'Unity-iPhone'과 use_frameworks!를 직접 써 넣기도 한다. 옵션을 끈 뒤에도 Podfile에 메인 타깃 블록이 남아 있는지 확인한다.
Facebook SDK를 쓰지 않는 게임 B는 Objective-C 환경이고, main target을 켠 상태에서 중복 문제가 관찰되지 않았다.
| 항목 | 게임 A | 게임 B |
|---|---|---|
| 환경 | Swift 필수(Facebook SDK) | Objective-C |
| main target 포함 시 | 같은 Pod이 두 타깃에 링크돼 Analytics 누락·크래시 | 문제 관찰되지 않음 |
| 최적 설정 | Main Target OFF | Main Target ON |
배운 점
섹션 제목: “배운 점”Resolver 설정은 프로젝트마다 따로 정한다. Swift 런타임이 필요한 SDK가 있으면 main target 포함 여부부터 확인하고, 빌드한 앱의 실행 로그에서 implemented in both 경고로 중복 링크를 확인한다.