앱 백그라운드 종료 후 카카오 공유 링크 클릭 시 질문

문의 시, 사용하시는 SDK 버전 정보와 디벨로퍼스 앱ID를 알려주세요.


안녕하세요!

앱을 백그라운드 종료 후 카카오 공유 링크 클릭 시 링크 관련 정보를 불러오지 못하여 문의 드립니다.

앱이 실행되고 있는 경우 링크 클릭 시 func scene(_ scene: UIScene, openURLContexts URLContexts: Set) 를 통해 링크 정보들이 잘 들어오는데 앱 종료 후에는 정보를 불러 오지 못한 상태로 앱이 켜집니다.

앱이 설치 되지 않았을 경우에는 스토어로 이동도 잘 되고 있급니다.

링크 클릭 시 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 에서 connectionOptions.userActivities 를 통해 들어 오는지 확인 시도를 해보았는데 확인이 어려워 문의 드립니다.

info.plist 파일 Queried URL Schemes에 kakaolink, kakaompassauth 설정되어 있고 URL types에 kakao{{nativeAppKey}} 설정되어 있습니다.

현재 KakaoSDKCommon, KakaoSDKShare 버전은 2.19.0 사용 중 입니다. 앱 아이디는 910131 입니다.

안녕하세요 !

정확한 내용 파악 후, 안내드리기 위해 재현 영상 첨부 부탁드립니다.

재현 영상.zip (7.8 MB)

안녕하세요!

재현 영상 압축 파일 첨부하였습니다.

감사합니다.

증상만 보면

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {

위 scene에서만 처리하고
아래 scene , 앱 실행시 파라메터 처리는 잘못된듯한데요.

func scene(_ scene: UIScene, 
willConnectTo session: UISceneSession, 
options connectionOptions: UIScene.ConnectionOptions) {

관련 코드 블럭 공유해주시겠어요?

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let scene = (scene as? UIWindowScene) else { return }
        let window = UIWindow(windowScene: scene)
        let splashViewModel = SplashViewModel()
        let splashViewController = SplashViewController(viewModel: splashViewModel)
        window.rootViewController = RootNavigationViewController(rootViewController: splashViewController)

        window.overrideUserInterfaceStyle = .light
        window.makeKeyAndVisible()
        self.window = window

        UNUserNotificationCenter.current().delegate = self

        //앱 꺼져있을경우 DynamicLink 이벤트 전달

        for userActivity in connectionOptions.userActivities {
            if userActivity.webpageURL != nil {
                self.scene(scene, continue: userActivity)
            } else {
                self.scene(scene, openURLContexts: connectionOptions.urlContexts)
            }
        }

        if let response = connectionOptions.notificationResponse {
            let userInfo = response.notification.request.content.userInfo
            NotificationCenter.default.post(name: Notification.Name("actionKey"), object: nil, userInfo: userInfo)
        }
    } 

    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {

        for context in URLContexts {
            let url = context.url

            ApplicationDelegate.shared.application(UIApplication.shared, open: url, sourceApplication: nil, annotation: [UIApplication.OpenURLOptionsKey.annotation])

            if (AuthApi.isKakaoTalkLoginUrl(url)) {
                _ = AuthController.handleOpenUrl(url: url)

                return
            }

            if (ShareApi.isKakaoTalkSharingUrl(url)) {

                let queryItems = URLComponents(string: url.absoluteString)?.queryItems

                if let code = queryItems?.filter({$0.name == "friend_code"}).first?.value  {
                    UserDefaults.standard.set(code, forKey: UserDefaultsKeyService.friendCode.rawValue)
                }

                if let endPoint = queryItems?.filter({$0.name == "ep"}).first?.value {
                    UserDefaults.standard.set(endPoint, forKey: UserDefaultsKeyService.endPoint.rawValue)
                    let split = endPoint.split(separator: "_")
                    if !split.isEmpty && split.count > 1 {
                        UserDefaults.standard.set(split[1], forKey: UserDefaultsKeyService.cardId.rawValue)
                    }
                }

                if let cardId = queryItems?.filter({$0.name == "card_id"}).first?.value {
                    UserDefaults.standard.set(cardId, forKey: UserDefaultsKeyService.cardId.rawValue)
                }

                return
            }
}

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        if let webUrl = userActivity.webpageURL {
            if (ShareApi.isKakaoTalkSharingUrl(webUrl)) {

                let queryItems = URLComponents(string: webUrl.absoluteString)?.queryItems

                if let code = queryItems?.filter({$0.name == "friend_code"}).first?.value  {
                    UserDefaults.standard.set(code, forKey: UserDefaultsKeyService.friendCode.rawValue)
                }

                if let endPoint = queryItems?.filter({$0.name == "ep"}).first?.value {
                    UserDefaults.standard.set(endPoint, forKey: UserDefaultsKeyService.endPoint.rawValue)
                    let split = endPoint.split(separator: "_")
                    if !split.isEmpty && split.count > 1 {
                        UserDefaults.standard.set(split[1], forKey: UserDefaultsKeyService.cardId.rawValue)
                    }
                }

                if let cardId = queryItems?.filter({$0.name == "card_id"}).first?.value {
                    UserDefaults.standard.set(cardId, forKey: UserDefaultsKeyService.cardId.rawValue)
                }

                return
            } else if let referenceUrl = userActivity.referrerURL {
                 if (ShareApi.isKakaoTalkSharingUrl(referenceUrl)) {

                let queryItems = URLComponents(string: referenceUrl.absoluteString)?.queryItems

                if let code = queryItems?.filter({$0.name == "friend_code"}).first?.value  {
                    print("loginloginloginloginlogin: \(code)")
                    UserDefaults.standard.set(code, forKey: UserDefaultsKeyService.friendCode.rawValue)
                }

                if let endPoint = queryItems?.filter({$0.name == "ep"}).first?.value {
                    UserDefaults.standard.set(endPoint, forKey: UserDefaultsKeyService.endPoint.rawValue)
                    let split = endPoint.split(separator: "_")
                    if !split.isEmpty && split.count > 1 {
                        UserDefaults.standard.set(split[1], forKey: UserDefaultsKeyService.cardId.rawValue)
                    }
                }

                if let cardId = queryItems?.filter({$0.name == "card_id"}).first?.value {
                    UserDefaults.standard.set(cardId, forKey: UserDefaultsKeyService.cardId.rawValue)
                }
}

SceneDelegate에 있는 카카오 공유 코드 전달 드립니다.

감사합니다!

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
구문에서 다른 로직 제외하고 url 어떻게 들어오는지 확인 부탁드려요.
if let url = connectionOptions.urlContexts.first?.url.absoluteString {
print(“url = (url)”)

1개의 좋아요

확인해보니 카카오 공유 링크 들어옵니다.

for userActivity in connectionOptions.userActivities {
            if userActivity.webpageURL != nil {
                self.scene(scene, continue: userActivity)
            } else {
                self.scene(scene, openURLContexts: connectionOptions.urlContexts)
            }
        }

이 부분이 문제였습니다 ㅠㅠ

connectionOptions.userActivities가 empty인 경우를 생각하지 못 했습니다.

        switch connectionOptions.userActivities.isEmpty {
        case true:
            self.scene(scene, openURLContexts: connectionOptions.urlContexts)
        case false:
            for userActivity in connectionOptions.userActivities {
                if userActivity.webpageURL != nil || userActivity.referrerURL != nil {
                    self.scene(scene, continue: userActivity)
                } else {
                    self.scene(scene, openURLContexts: connectionOptions.urlContexts)
                }
            }
        }

이렇게 변경 하니 백그라운드에서 종료 되었을 떄도 링크 잘 타고 들어가집니다.

덕분에 해결 되었습니다.

정말 감사합니다 :smile:

1개의 좋아요