안드로이드 UserApiClient callback 무응답

멀티 앱 UserApiClient 콜백 관련

SDK 버전 정보

compileSdkVersion = 33
minSdkVersion = 26
targetSdkVersion = 33

디벨로퍼스 앱ID: 926261

문제 상황

문제 발생 지점은 기존 앱에 멀티 앱으로 등록한 앱입니다. 기존 앱을 A, 멀티 앱을 B라고 하면 B는 A의 로그인, 로그아웃, 토큰, 탈퇴 등의 로직을 동일하게 사용중이며, 멀티 앱 가이드라인과 같이 네이티브 앱 키는 A의 키, Manifestscheme은 B의 커스텀 스킴을 사용중이며, SDK 초기화 함수의 매개변수에도 커스텀 스킴 값을 넘겨주어 사용중입니다.

KakaoSdk.init(
    context = this,
    appKey = getString(R.string.kakao_native_app_key),
    customScheme = getString(R.string.kakao_scheme)
)
<activity android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:host="oauth"
            android:scheme="@string/kakao_scheme" />
    </intent-filter>
</activity>

문제는 UserApiClient를 탈 때, 내부 메서드는 실행이 되나 callback이 오지 않는다는 점입니다. 아래는 B의 코드이며, A와 동일한 코드를 사용함에도 불구하고 A에서는 잘 실행되던 callback 부분이 실행되지 않는 오류가 있습니다. 멀티 앱 관련 오류인 것 같아서 확인 요청드립니다.

if (socialType == IndivLoginType.KAKAO.jsonValue) {
    Timber.d("카카오 로그아웃 실행")
    UserApiClient.instance.me { user, error ->
        Timber.d("UserApiClient.me called")
        if (error != null)
            Timber.d("error: ${error.toString()}")
        if (user != null) {
            Timber.d("사용자 정보 요청 성공")
            // 사용자가 로그인 상태일 경우
            UserApiClient.instance.logout { logoutError ->
                Timber.d("로그아웃 실행")
                callback()
            }
        } else {
            Timber.d("사용자 정보 요청 실패")
            // 사용자가 로그인 상태가 아닌 경우, 여기서 추가적인 처리나 메시지 출력 등을 할 수 있습니다.
            callback()
        }
    }
}

카카오 로그인 사용자가 로그아웃을 시도할 때, 해당 코드에서 UserApiClient.instance.me로 정보를 가져온 후 정보가 있으면(로그인이 되어 있으면) 로그아웃 메서드를 불러 로그아웃을 시도했습니다. 디버깅시 UserApiClient.instance.me 이전의 로그는 잘 찍히나("카카오 로그아웃 실행"), 이후 callback이 오지 않는지 바로 아래의 로그("UserApiClient.me called")를 포함한 어떤 로그도 찍히지 않는 것을 확인할 수 있었습니다. 해당 부분이 멀티 앱의 설정 문제인지 확인 부탁드리겠습니다.

안녕하세요.

B앱에서 UserApiClient.instance.me 사용 이력이 확인되지 않습니다.
해당 API 사용전에 사용자 토큰이 유효한지 확인 부탁드리며
일반적으로 logout 요청 전에 UserApiClient.instance.me 호출하지 않고 logout만 호출 합니다.

토큰 유효 확인: 토큰 존재 여부 확인하기

안녕하세요. 말씀하신대로 UserApiClient.instance.me 실행 전에 AuthApiClient.instance.hasToken()으로 토큰 존재 여부를 확인해 보았습니다. 결과는 아래와 같이 true로 나왔습니다.

Token Check

그러나 위와 같이 UserApiClient.instance.me의 중괄호 내부 부분이 실행되지 않고 그 이후 로직인 앱 재시작이 되는 것을 볼 수 있었습니다. 또한 말씀하신 바와 같이 UserApiClient.instance.me를 호출하지 않고 UserApiClient.instance.logout만 호출해도 동일하게 로그아웃은 되나 callback이 실행되지 않는 오류가 있었습니다.

A 앱과 동일한 코드를 사용하고, 로그인은 정상적으로 작동하고 이후 토큰을 받아옴에도 문제가 없는데 추가적으로 발생할 수 있는 문제 상황이 있을까요?

+ 멀티 앱 등록 전에 B 앱을 따로 카카오 디벨로퍼스에 등록해 두었는데 이로 인한 오류가 발생할 수 있는지도 확인 부탁드리겠습니다. 해당 앱의 ID는 1071155입니다.

안녕하세요.

코드에는 달리 문제가 없어보이는데요 해당 API는 언제 호출하고 있으신가요?

안녕하세요. 카카오 로그인 완료 후 유저 정보 화면에서 로그아웃 버튼을 눌렀을 때 실행하고 있습니다.

앞서 말씀드린 바와 같이 callback이 오지 않고 넘어가버리기 때문에 해당 부분에서도 callback이 실행되지 않아 세션을 초기화하지 못해 앱은 재실행되나 로그인 된 카카오 ID로 자동으로 로그인이 되버립니다(Splash에 자동 로그인 로직 있음). 원래는 로그아웃 후 앱이 재실행되면 로그인 화면으로 이동해야 하는데 어디를 손봐야 할지 잘 모르겠습니다.

최근 24시간 내 멀티 앱으로 보이는 com.cheonu.zcarschool 패키지에서 카카오 로그인이나 말씀하신 API 호출 이력이 확인되지 않는데요 customScheme 설정 값이 정상 전달되었는지 확인 부탁드립니다.

추가로, API 요청이 확인되지 않는 것으로보아 SDK가 비동기로 API를 호출하기 전에 앞의 스레드가 먼저 제거되는건 아닌지 의심 되는데요 하지만, 제공해주신 정보만으로는 자세한 확인이 어렵습니다.

디벨로퍼스에서 제공되는 샘플 코드에 서비스측 앱키를 대입하여 비교 테스트 부탁드리며 본 앱에서는 splash 를 제거하고 테스트 해보시는 것을 추천드립니다.

말씀하신대로 확인해보니 제가 callback을 이상한 곳에 주고 있었네요. 스키마나 기타 설정에는 문제가 없는 것 같습니다. 괜한 문제로 시간쓰게 해드려 죄송합니다. 그리고 친절하고 자세하게 응대해주신 점 감사드립니다.

1개의 좋아요