V2 업그레이드 후 SdkError가 많이 발생합니다

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


SDK version : 2.13.0
APP id : 2076

올해 초까지 v1으로 쓰다가 종료가 임박하여 업데이트 적용 되었습니다.
v2가 적용된 버전부터 사용자들로부터 아래 오류가 수집되고 있습니다.

  • 작업을 완료할 수 없습니다. (KakaoSDKCommon.SdkError 오류 0.)
  • 작업을 완료할 수 없습니다. (KakaoSDKCommon.SdkError 오류 2.)

테스트 시나리오에서는 정상 동작하고 있어,
어떤 시점 또는 원인에 의해 발생하는 오류인지 확인 부탁드립니다.

안녕하세요.

KOE322 오류가 다수 확인됩니다.
유효하지 않은 refresh_token를 사용하여 접근토큰 갱신 시, 발생되는 오류인데요

서비스측에서 접근토큰 갱신과 갱신 실패 시, 오류처리를 어떻게 하고 계실까요?

아래와 같은 로그인 절차를 진행합니다.

  • AuthApi.hasToken() 체크
  • 토큰 없을 시 UserApi.shared.loginWithKakaoTalk (또는 loginWithKakaoAccount) 요청
  • 실패시 로그 수집 (추가 조치 없음)
  • 성공시 UserApi.shared.me 요청

질문에 언급한, 수집 오류메시지는 loginWith~ 의 응답에서 error가 nil이 아닐 때 수집하고,
오류발생시 그대로 로그인 절차를 빠져 나옵니다.

AuthApi.hasToken() 기능은 토큰 존재 여부만을 확인하고, 유효 여부는 확인하지 않습니다.

때문에, UserApi.shared.me() 같은 기능 사용 시, 토큰 존재하지만 만료된 경우 갱신하게 되는데요 이 때, 리프래시 토큰마져 만료된 경우 갱신하지 않고 오류로 반환됩니다.

때문에, AuthApi.hasToken() 으로 토큰이 존재하는 경우 토큰 정보보기 API를 통해 유효한지 확인 하신뒤 로그인 페이지로 이동하면 좋을것 같습니다.

답변 감사합니다.
hasToken 확인 후 유효토큰 체크하는 로직은 검토하여 적용하면 될 것 같아요.

다만, 저 오류는 로그인 시도시 ( loginWithKakaoTalk 또는 loginWithKakaoAccount ) 응답받은 오류입니다.
유효하지 않은 토큰이어도 로그인을 시도하면 새로 토큰이 갱신되는 게 아닌가요?
이 부분이 잘 이해가 가질 않는군요… ^^;

안녕하세요.

오류 발생 시점의 로그를 제공받을 수 있을까요?

죄송합니다.
테스트 중에는 재현이 안되고 있어서 로그를 확인할 수가 없습니다.

문의드린 오류메시지는
앱에 심어져 있는 로그 트래킹에서 넘어온 것으로,
아래 코드에서 발생했습니다.

  • 로그인 시도 후 실패한 error 값의 메시지
let completion: ((OAuthToken?, Error?) -> Void) = { token, error  in
    if let e = error {
        if !e.localizedDescription.contains("cancel") {
            TrackingService.shared.trackingLogin(.Error, label: "Kakao", errorMessage: e.localizedDescription)   // 오류메시지 전송한 부분
        }
        resultHandler(nil)
        return
    }
	...
}
			
UserApi.shared.loginWithKakaoTalk(completion: completion)

localizedDescription: The operation couldn’t be completed. (command.SdkError error 0.)

위 코드는 항상 true로 처리될것 같은데요. 확인 부탁드립니다

"\(error)"
ClientFailed(reason: command.ClientFailureReason.Cancelled, errorMessage: Optional(“The KakaoTalk authentication has been canceled by user.”))

트래킹은 "\(error)"로 하시는게 좋을것 같습니다.
"\(error)".contains("cancel") 와 같이 메시지를 분리 하실수도 있지만, 에러 객체를 직접 확인하시는게 좋을것 같습니다.

if let kError = error as? SdkError {
    if(kError.isClientFailed && kError.getClientError().reason == .Cancelled) {
        print("User Cancled.")
    }
}

네, 답변 감사합니다.
error 트래킹을 있는 그대로 하도록 적용하여 모니터링 해볼게요!