앱이 살아있는 경우 iOS 장비에서 카카오링크 클릭하면, application:openURL:options: 으로 url이 정상적으로 넘어옵니다.
하지만, 앱을 완전히 내린후, 카카오링크를 클릭하면, application:didFinishLaunchingWithOptions로 들어오는데, 이때 options에는 아무런 정보가 없습니다.
정리하자면, 앱이 완전히 죽은 상태에서 카카오링크를 눌렀을때, 뭔가를 처리하고 싶은데, 어디서 처리해줘야 할까요?
또 자문자답이지만, 다른 분들을 위해 남김니다.
결과적으로 보면, 카카오 SDK의 문제가 아니고, iOS쪽 문제였습니다.
아시다시피 iOS 13으로 넘어오면서, SceneDelegate라는 클래스가 생겼는데, 요놈이 아주 요물입니다. 결국, application:didFinishLaunchingWithOptions에 launchOptions는 아무런 정보가 넘어오지 않습니다.
아마도 생성 시기적으로 didFinishLaunchingWithOptions가 완료된 후에 SceneDelegate의 scene:willConnectToSession:options에서 뭔가를 해야 하나 봅니다.
- 결국, iOS 13부터는 앱이 완전히 죽어있는 상태에서 custom scheme을 클릭했을때, launchOptions에는 아무런 정보가 넘어오지 않는다.
- SceneDelegate에는 launchOptions이 넘어오므로, 여기서 처리해줘야 한다… 인것 같습니다.
애플 document 어디를 봐도 이런 내용은 없던데, 잡스형님이 가시고 난뒤로, 애플의 document 관리가 좀 맛이 가고 있는듯 하군요.
제가 구현한 코드는 다음과 같습니다.
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions API_AVAILABLE(ios(13.0)){
// 희안하게 application:didFinishLaunchingWithOptions: 쪽의 launchOptions에는 아무것도 안들어오고, 이쪽에는 들어있다.
//
if(connectionOptions.URLContexts.count > 0){
UIOpenURLContext* urlContext = connectionOptions.URLContexts.anyObject;
// 바로 처리해주면, 또 안되네, 조금 기다렸다가 처리하라고 시키자.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UIApplication* application = [UIApplication sharedApplication];
[application.delegate application:application openURL:urlContext.URL options:@{}];
});
}
}
혹시 제가 잘못 알고 있는 부분이 있으면, 알려주세요.
저 UISceneDelegate라는 녀석이 뭐하는 놈인지도 모르겠고, 그냥 예전처럼 AppDelegate만 있는 행복한 세상에 살고 싶다면, UISceneDelegate를 opt out 해버리는 방법도 있습니다. 다음을 참조하세요. 짜증나면 그냥 opt out 해버릴까…
https://stackoverflow.com/questions/57467003/xcode-11-opt-out-of-uiscenedelegate-swiftui-on-ios-13