카카오 로그인 시 토큰 받아오는 속도가 느리고 타 앱으로 이동하는 현상이 발생합니다

응답이 느렸던 시간은 낮부터 지금까지 계속 느립니다.

현재 앱스토어에 올라가 있지 않은 상태입니다.

카카오측 로그에는 모두 30ms 안밖으로 응답되었습니다.
로그인 후, 앱으로 돌아왔을 때가 늦으신건가요?
아니면 앱으로 돌아온 후 접근토큰을 반환하는 콜백 반응이 느린것인가요?

앱으로 돌아왔을 때 UserApi.shared.loginWithKakaoTalk {(oauthToken, error) in }의 콜백의 반응이 느립니다.

로그상에는 응답이 즉각 이루어져서 딜레이가 확인되지 않는데요
직접 구현 및 테스트 해봐야 할것 같습니다.
로그인에 사용한 코드를 공유 부탁드립니다. (loginWithKakaoTalk 호출 전후 및 파라미터)

카카오톡으로 로그인을 하면 현재 이 kakaoLoginCheck() 함수가 호출됩니다.

/// kakao talk이 설치되어있으면 kakaotalk으로 로그인, 아니면 카카오계정 로그인

    private func kakaoLoginCheck(_ indicatorOn: ChinsaViewController, onSuccess: @escaping (Int) -> Void, onFail: @escaping () -> Void) {
        
        // 카카오톡 설치 여부 확인
        if UserApi.isKakaoTalkLoginAvailable() {
            UserApi.shared.loginWithKakaoTalk {(oauthToken, error) in
                if let error = error {
                    Log.err(error)
                    onFail()
                }
                else {
                    Log.info("loginWithKakaoTalk() success.")
                    _ = oauthToken

                    self.loadingView = TouchBlockedView(frame: indicatorOn.view.frame)
                    indicatorOn.view.addSubview(self.loadingView)
                    self.loadingView.show()
                    
                    self.getKakaoUserProfileInfo(indicatorOn, onSuccess: {
                        
                        self.socialCheck(socialKind: .kakao, indicatorOn, onSuccess: { code in
                            onSuccess(code)
                            
                        }, onFail: {
                            onFail()
                        })
                    }, onFail: {
                        onFail()
                    })
                }
            }
        }
        else { //카카오톡 미설치
            
            Log.info("KakaoTalk is not installed.")
            self.loadingView = TouchBlockedView(frame: indicatorOn.view.frame)
            indicatorOn.view.addSubview(self.loadingView)
            self.loadingView.show()
            
            self.kakaoAccountLogin(indicatorOn, onSuccess: {
                
                self.getKakaoUserProfileInfo(indicatorOn, onSuccess: {
                    
                    self.socialCheck(socialKind: .kakao, indicatorOn, onSuccess: { code in
                        onSuccess(code)
                        
                    }, onFail: {
                        onFail()
                    })
                }, onFail: {
                    onFail()
                })
            }, onFail: {
                onFail()
            })
        }
    }

안녕하세요.

동일하게 구성해보았으나 재현이 되지 않아 추가 문의 드립니다.

아래 샘플 코드에서도 동일한 증상이 나타나실까요?

Kakao Developers - 최신 버전 샘플 다운로드

샘플 코드에서는 동일한 증상이 나타나지 않습니다. 샘플 코드와 같이 카카오톡 설치했을 때 UserApi.shared.loginWithKakaoTalk { (oauthToken, error) in 코드를 수행하는데 카카오 로그인 후 앱으로 돌아왔을 때 이런 로그가 찍힙니다.
2022-12-15 10:29:44364 [:information_source:][Api.swift 125:41] → response:

Optional({

"access_token" = “l9-DSztlhV9Spnp2i2-J-8gbvODXuSnn6bnUYZT3CinI2gAAAYUTZtSh”;

"expires_in" = 43199;

"refresh_token" = “INK9myoRVxqSph3tJI-1yS9U8PNhNeNshvUAaCggCinI2gAAAYUTZtSf”;

"refresh_token_expires_in" = 5183999;

scope = “account_email profile_image profile_nickname”;

"token_type" = bearer;

})

그리고 몇 초 뒤에 하단의 로그가 찍힙니다.
2022-12-15 10:29:54293 [:speech_balloon:][Auth.swift 49:17] → >>>> [KakaoSDKCommon.SessionType.Api: Alamofire.Session, KakaoSDKCommon.SessionType.Auth: Alamofire.Session, KakaoSDKCommon.SessionType.AuthApi: Alamofire.Session, KakaoSDKCommon.SessionType.RxAuthApi: Alamofire.Session]

2022-12-15 10:29:54293 [:speech_balloon:][MigrateManager.swift 20:17] → ============================================================================================================

2022-12-15 10:29:54293 [:speech_balloon:][MigrateManager.swift 21:17] → check migration…

2022-12-15 10:29:54294 [:speech_balloon:][MigrateManager.swift 42:17] → ============================================================================================================

2022-12-15 10:29:54294 [:speech_balloon:][MigrateManager.swift 43:17] → start migration sdk from v1 to v2…

2022-12-15 10:29:54294 [:speech_balloon:][MigrateManager.swift 67:21] → first time sdk v2…

2022-12-15 10:29:54295 [:speech_balloon:][MigrateManager.swift 95:17] → finished migration sdk…

2022-12-15 10:29:54295 [:speech_balloon:][Properties.swift 22:21] → save-plain : {length = 274, bytes = 0x7b227265 66726573 68546f6b 656e4578 … 223a3433 3139397d }

2022-12-15 10:29:54299 [:speech_balloon:][Properties.swift 24:21] → save-crypted : {length = 288, bytes = 0x4a6bde52 4cdd4b87 28d99b10 ad4ce077 … 89fcdc37 3e3eccc0 }

참고로 저희 앱에서 찍힌 로그입니다.

카카오측 로그에는 10:29:44359 에 토큰발급이 정상처리되었고 위 로그에서는 시간 지연이 없습니다.
샘플코드에서 친한의사 앱키를 사용하여 가입 테스트 해 보았으나 재현되지 않는데요

번거로우시겠지만, 지연현상이 일어나는 상황을 영상으로 제공 가능하실까요?
( 로그가 올라가는게 같이 표시되면 좋을것 같습니다. )

네! 영상 링크 보내드립니다.
https://drive.google.com/file/d/1jawK7c40fN3gfmVkTOH2sfD2vhonSNCi/view?usp=share_link

2개의 좋아요

안녕하세요.

예제코드를 보니 일단 의심되는것이 UI 처리 로직인데요.
SDK response 콜백은 별도 쓰레드에서 리턴이 되므로 UI처리가 필요한 경우 메인쓰레드에서 실행되도록

DispatchQueue.main.async {
...
}

로 감싸주어야 합니다.

예)

// 카카오톡 설치 여부 확인
if UserApi.isKakaoTalkLoginAvailable() {
    UserApi.shared.loginWithKakaoTalk {(oauthToken, error) in
       if let error = error {
           Log.err(error)
           onFail()
       }
       else {
           DispatchQueue.main.async {
           //UI 처리 로직
           }
       }
    }
}
1개의 좋아요

네 답변 감사합니다! 해당 부분 수정 후 다시 시도해보겠습니다.

1개의 좋아요

현재 UI 변경이 일어나는 부분은 DispatchQueue.main.async { } 로 감싸서 메인 쓰레드에서 처리하도록 했습니다. 그런데 지연되는 문제는 해결되지 않았습니다.

/// kakao talk이 설치되어있으면 kakaotalk으로 로그인, 아니면 카카오계정 로그인
    private func kakaoLoginCheck(_ indicatorOn: ChinsaViewController, onSuccess: @escaping (Int) -> Void, onFail: @escaping () -> Void) {
        
        // 카카오톡 설치 여부 확인
        if UserApi.isKakaoTalkLoginAvailable() {
            UserApi.shared.loginWithKakaoTalk { (oauthToken, error) in
                if let error = error {
                    Log.err(error)
                    onFail()
                }
                else {
                    Log.info("loginWithKakaoTalk() success.")

                    DispatchQueue.main.async {
                        
                        self.loadingView = TouchBlockedView(frame: indicatorOn.view.frame)
                        indicatorOn.view.addSubview(self.loadingView)
                        self.loadingView.show()
                        
                        self.getKakaoUserProfileInfo(indicatorOn, onSuccess: {
                            
                            self.socialCheck(socialKind: .kakao, indicatorOn, onSuccess: { code in
                                onSuccess(code)
                                
                            }, onFail: {
                                onFail()
                            })
                        }, onFail: {
                            onFail()
                        })
                        _ = oauthToken
                    }
                }
            }
        }
        else { //카카오톡 미설치
            
            Log.info("KakaoTalk is not installed.")
            DispatchQueue.main.async {
                self.loadingView = TouchBlockedView(frame: indicatorOn.view.frame)
                indicatorOn.view.addSubview(self.loadingView)
                self.loadingView.show()
                
                self.kakaoAccountLogin(indicatorOn, onSuccess: {
                    
                    self.getKakaoUserProfileInfo(indicatorOn, onSuccess: {
                        
                        self.socialCheck(socialKind: .kakao, indicatorOn, onSuccess: { code in
                            onSuccess(code)
                            
                        }, onFail: {
                            onFail()
                        })
                    }, onFail: {
                        onFail()
                    })
                }, onFail: {
                    onFail()
                })
            }
        }
    }

안녕하세요.
제가 오늘 휴가라서 늦게 답변 드립니다.
올려준 코드를 보면 SDK response 클로저 안에서 뷰생성자를 호출하고 있는것으로 보입니다.
실행 퍼로먼스를 중요하게 생각하신다면 해당 구조는 좀 이슈가 있을것으로 보입니다.
(예를들면 터치블럭드뷰는 미리 로그인전에 생성을 해놓고, 숨겨놓고 있다가 보이게 한다든가? 등…)
그래서, 뷰생성자와 관련된 로직을 전부 주석처리하고 로그만 찍거나 하는 방식으로 테스트해서 같은현상이 생기는지등의 확인이 필요해 보입니다.

1개의 좋아요

안녕하세요. 어제까지 휴가라서 늦게 답변 드렸네요. 죄송합니다.
답변주신 내용대로 코드확인하여 수정해보도록 하겠습니다.

1개의 좋아요

코드 수정 후 카카오톡 로그인 지연되는 문제 해결되었습니다. 도와주셔서 감사합니다!
문제를 확인해보니 카카오톡과 네이버 로그인에서 앱으로 돌아올 때 필요한 코드가 서로 달라서 SceneDelegate 파일에 두 줄을 넣었는데 카카오톡 로그인 시 네이버 로그인에 사용하는 코드를 실행해서 발생한 이슈였습니다.
아래 코드처럼 네이버와 카카오톡 로그인에서 실행해야할 코드를 분리해서 해결했습니다.

/// kakao talk에서 친사로 다시 돌아올 때 사용
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        
        if let url = URLContexts.first?.url {
            ///kakao login
            if (AuthApi.isKakaoTalkLoginUrl(url)) {
                _ = AuthController.handleOpenUrl(url: url)
            } else {
                ///naver login
                NaverThirdPartyLoginConnection.getSharedInstance().receiveAccessToken(url) //naver login 화면이 새로 등장 -> 토큰을 요청하는 코드
            }
        }
    }
3개의 좋아요

안녕하십니까! 현재 카카오톡 로그인 후 ‘케어닥’ 이라는 타사 앱이 실행되는 현상이 해결된 것을 확인했습니다. 혹시 이 현상 어떻게 해결해주신건지 말씀해주실 수 있나요?

안녕하세요.

제3의 앱에서 카카오톡 앱의 인텐트 스킴을 사용하면, 인텐트 스킴 호출방식 카카오 로그인 시 해당 앱이 실행될 수 있는데요.
이경우 디벨로퍼스 약관 위반으로 안내하고 카카오의 모든 기능을 사용할 수 없도록 차단하고 있습니다.

하지만, 처음 문의하셨을때 확인 해보니 케어닥은 해당 증상 재현되지 않았습니다.
따로 조치한 것은 없고, 조금전 다시 확인해보니 여전히 해당 증상없는 것으로 확인됩니다.

참고부탁드려요.

1개의 좋아요

저희 쪽에서 개발 실수가 있었던 것으로 확인하여 수정했습니다. 답변 감사합니다!

1개의 좋아요