카카오링크 클릭시 didFinishLaunchingWithOptions에 아무런 정보가 안넘어옵니다

앱이 살아있는 경우 iOS 장비에서 카카오링크 클릭하면, application:openURL:options: 으로 url이 정상적으로 넘어옵니다.

하지만, 앱을 완전히 내린후, 카카오링크를 클릭하면, application:didFinishLaunchingWithOptions로 들어오는데, 이때 options에는 아무런 정보가 없습니다.

정리하자면, 앱이 완전히 죽은 상태에서 카카오링크를 눌렀을때, 뭔가를 처리하고 싶은데, 어디서 처리해줘야 할까요?

또 자문자답이지만, 다른 분들을 위해 남김니다.

결과적으로 보면, 카카오 SDK의 문제가 아니고, iOS쪽 문제였습니다.

아시다시피 iOS 13으로 넘어오면서, SceneDelegate라는 클래스가 생겼는데, 요놈이 아주 요물입니다. 결국, application:didFinishLaunchingWithOptions에 launchOptions는 아무런 정보가 넘어오지 않습니다.

아마도 생성 시기적으로 didFinishLaunchingWithOptions가 완료된 후에 SceneDelegate의 scene:willConnectToSession:options에서 뭔가를 해야 하나 봅니다.

  1. 결국, iOS 13부터는 앱이 완전히 죽어있는 상태에서 custom scheme을 클릭했을때, launchOptions에는 아무런 정보가 넘어오지 않는다.
  2. 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