[Xcode 27] SceneDelegate 전환 필수화 및 Airbridge 딥링크 추가 설정 안내
[Xcode 27] SceneDelegate 전환 필수화 및 Airbridge 딥링크 추가 설정 안내
이 문서는 기존 AppDelegate 기반 앱을
SceneDelegate(UIScene 생명주기)로 전환해야 하는 고객을 위한 트러블슈팅 가이드입니다.문제 현상
- Xcode 27에서 빌드한 앱을 실행하면 화면이 흰 화면으로 표시되거나, 앱이 정상적으로 그려지지 않습니다.
- 스킴 딥링크(Scheme Deeplink) 또는 유니버설 링크(Universal Links)로 앱에 진입해도 Airbridge 딥링크 이벤트가 수집되지 않습니다.
- 개발자 가이드의 SDK 초기화하기와 딥링크 설정하기 예제 중
AppDelegate방식대로 코드를 작성했는데도 동작하지 않습니다.
발생 원인
Apple은 앱 생명주기를UIApplicationDelegate(AppDelegate) 단독 방식에서 UIScene 기반(SceneDelegate) 방식으로 전환하고 있으며, 최신 Xcode/iOS에서는 Scene 생명주기 채택이 사실상 필수가 되었습니다.앱이 UIApplicationSceneManifest를 통해 Scene 생명주기를 채택하면, 다음 AppDelegate 콜백은 더 이상 호출되지 않습니다.해결 방법
- Swift
- Objective-C
1. Info.plist에 Scene Manifest 추가
Info.plist에 아래 UIApplicationSceneManifest를 추가합니다.UISceneDelegateClassName 값은 사용하는 언어/모듈에 맞게 지정합니다.- Objective-C:
SceneDelegate - Swift:
$(PRODUCT_MODULE_NAME).SceneDelegate
2. SceneDelegate 생성 및 딥링크 수집 코드를 SceneDelegate로 이전
- Swift
- Objective-C
3. AppDelegate 정리
- SDK 초기화 코드(
Airbridge.initializeSDK(option:), Objective-C:[Airbridge initializeSDKWithOption:])는application:didFinishLaunchingWithOptions:에 그대로 둡니다. - 딥링크 수집을 위해 작성했던
application:open:options:(application:openURL:options:)와application:continue:restorationHandler:의trackDeeplink/handleDeeplink호출 코드는 Scene 생명주기에서 호출되지 않으므로,SceneDelegate로 이전한 뒤AppDelegate에서는 삭제합니다. application:didFinishLaunchingWithOptions:에서window를 생성하고rootViewController를 설정했다면, 해당 코드도SceneDelegate의scene:willConnectTo:options:로 이전해야 합니다. Scene 생명주기에서는window를SceneDelegate가 소유하므로,AppDelegate에 남겨두면 화면이 표시되지 않습니다.
Swift 6환경에서 handleDeeplink 및 handleDeferredDeeplink 함수등에서 입력한 Closure가 호출되는 시점에 앱이 종료되는 현상
Swift 6환경에서 handleDeeplink 및 handleDeferredDeeplink 함수등에서 입력한 Closure가 호출되는 시점에 앱이 종료되는 현상
문제 현상
Swift 6환경에서handleDeeplink 및 handleDeferredDeeplink 함수등에서 입력한 Closure가 호출되는 시점에 앱이 크래시되는 현상영향을 받는 함수Airbridge.handleDeeplinkAirbridge.handleDeferredDeeplinkAirbridge.createTrackingLinkAirbridge.clickAirbridge.impressionAirbridgeOptionBuilder.setOnAttributionReceived
발생 원인
Swift 5.x 이하에서는 멀티스레드 환경에서 여러 스레드가 동시에 같은 메모리에 접근하는 데이터 레이스 위험이 있어도 컴파일러가 경고만 주었으나 Swift 6 환경에서는 컴파일러 단계에서 다른 스레드(Actor 격리 영역)로 넘어가서 실행될 수 있는 모든 데이터와 클로저는 스레드 간 이동이 안전하다는 것을 반드시 증명해야 하며, 그렇지 않으면 컴파일 에러를 발생시키거나 하위 호환성 빌드 시 런타임 크래시를 유발합니다.해결 방법
에어브릿지 SDK에서 클로저를 파라미터로 받는 함수를 사용할 때, 클로저 내부 변수 앞에@Sendable 어노테이션을 명시적으로 추가하여 데이터가 스레드 간에 안전하게 전달됨을 컴파일러에게 알려야 합니다.Deep Link Install(Open)이 발생하지 않고 Organic Install(Open)이 발생합니다.
Deep Link Install(Open)이 발생하지 않고 Organic Install(Open)이 발생합니다.
문제 원인
iOS Lifecycle의didBecomeActive 이전에 trackDeeplink를 호출해야 Deep link Install 혹은 Deep link Open이 발생합니다. didBecomeActive 이후에 trackDeeplink를 발생했을 경우에 Organic Install 혹은 Open이 발생합니다.발생 현상
Deeplink Install 혹은 Deeplink Open이 발생하지 않고 Install(Open)이 발생 합니다.해결 방법
didBecomeActive 이전에 trackDeeplink 를 호출 해 주세요. AirbridgeOptionBuilder에서 setLogLevel 을 Debug로 설정하면 다음과 같은 로그를 순차적으로 확인 할 수 있습니다.4.9.0 업데이트시에 Airbridge Symbol을 찾을 수 없는 현상
4.9.0 업데이트시에 Airbridge Symbol을 찾을 수 없는 현상
CocoaPods이 4.7.0 버전을 찾지 못하는 문제
CocoaPods이 4.7.0 버전을 찾지 못하는 문제
4.7.1배포 도중에 4.7.0이 삭제되는 이슈가 발생하여, 4.7.0에 대한 버전이 CocoaPods에 재배포가 되었습니다.CocoaPods이 버전을 찾지 못하거나, 설치한 Pods에 대해서 Checksum 오류가 표시된다면 다음을 진행 해 주세요.
저장된 암호의 도메인이 airbridge.io 또는 abr.ge로 보이는 문제
저장된 암호의 도메인이 airbridge.io 또는 abr.ge로 보이는 문제
문제 현상
Password AutoFill 기능으로 저장된 암호의 도메인이airbridge.io 또는 abr.ge로 보이는 현상이 앱을 사용하는 유저에게 발생할 수 있습니다.발생 원인
에어브릿지 SDK의 딥링크를 설정한 후에 Password AutoFill 기능을 활용하면 도메인이 에어브릿지 딥링크의 앱 링크(applinks) 도메인airbridge.io 또는 abr.ge로 저장됩니다.해결 방법
Password AutoFill에 사용하는 webcredentials 도메인을 설정하면 문제를 해결할 수 있습니다.- 암호를 저장하는 도메인을 준비해주세요.
- 아래 JSON을
https://YOUR_DOMAIN/.well-known/apple-app-site-association에Content-Type: application/json으로 호스팅합니다. 준비한 도메인이YOUR_DOMAIN입니다.
- Xcode의 [YOUR_PROJECT]>[Signing & Capabilities]로 이동합니다.
- ’+ Capability’를 클릭해 Associated Domains를 추가합니다. Associated Domains에
webcredentials:YOUR_DOMAIN을 입력합니다.