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

카카오 SDK 중 ‘KakaoSDKUser’ 2.12.0을 사용하고 있는데 두 가지 문제가 발생합니다. 첫 번째는, 개발 중인 앱에 카카오톡 앱으로 로그인 사용시 토큰을 받아오는 속도가 현저히 느립니다. 두 번째는 저희 앱에서 카카오톡으로 로그인 후 '케어닥’이라는 타사 앱이 실행되는 현상이 일어나고 있습니다. 확인부탁드립니다.

안녕하세요.

앱 ID와 응답이 느렸던 시간대를 알려주실수 있을까요?

그리고 케어닥의 경우 해당 앱에서 로그인 스킴을 가로채는경우 타 앱으로 이동할수 있는데요 확인 후 조치하도록 하겠습니다.
제보해 주셔서 감사합니다.

케어닥에서 카카로 로그인 스킴을 가로채는것 같지 않습니다.
서비스측 앱에서 확인해볼수 있도록 앱ID 부탁드립니다.

앱 ID는 755381입니다.

앱스토에 검색가능한 이름이 어떻게 될까요?

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

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

카카오측 로그에는 모두 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()
            })
        }
    }

안녕하세요.

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

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

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

샘플 코드에서는 동일한 증상이 나타나지 않습니다. 샘플 코드와 같이 카카오톡 설치했을 때 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개의 좋아요