환경
- kakao_flutter_sdk_user: 1.10.0
- Flutter: 3.38.7 (stable)
- Dart: 3.10.7
- 대상 기기: 일부 iPhone (구형 아님, iOS 최신)
- 디벨로퍼스 앱ID: 775109
Flutter 앱에서 카카오 로그인을 구현하고 있습니다.
일부 iOS 사용자에게서 아래 현상이 반복적으로 발생합니다.
loginWithKakaoTalk() 호출
- 카카오톡 앱이 열림
- 인증 화면 없이 즉시 원래 앱 가입 화면으로 돌아옴
- 로그인이 완료되지 않고 가입 화면에 머무름
-
앱이 재시작(cold start)되지 않음 (스플래시 화면 없이 기존 화면 유지)
-
에러 메시지 없음
-
Crashlytics에 별도 로그 없음
-
Android에서는 문제 없음
-
모든 iPhone이 아닌 특정 기기에서만 발생
영상 참고
코드
Future<bool> login() async {
try {
final bool isInstalled = await isKakaoTalkInstalled();
if (isInstalled) {
try {
await UserApi.instance
.loginWithKakaoTalk()
.timeout(const Duration(seconds: 15));
return true;
} on PlatformException catch (e) {
if (e.code == "CANCELED") {
return false;
}
} on TimeoutException {
debugPrint(
"[kakao] KakaoTalk timeout, falling back to
account login");
}
}
try {
await UserApi.instance
.loginWithKakaoAccount()
.timeout(const Duration(seconds: 15));
return true;
} on PlatformException catch (e, st) {
if (e.code == "CANCELED") {
return false;
}
debugPrint("[kakao] KakaoAccount login error:
${e.code}");
FirebaseCrashlytics.instance.recordError(
e, st,
reason:
'KakaoAccount loginWithKakaoAccount
PlatformException: ${e.code}',
fatal: false,
);
throw LoginException(
type: LoginErrorType.unknown,
message: "카카오 로그인에 실패했습니다",
);
} on TimeoutException catch (e, st) {
FirebaseCrashlytics.instance.recordError(
e, st,
reason: 'KakaoAccount loginWithKakaoAccount
timeout',
fatal: false,
);
throw LoginException(
type: LoginErrorType.timeout,
message: "카카오 로그인 시간이 초과되었습니다",
);
} on SocketException catch (e, st) {
FirebaseCrashlytics.instance.recordError(
e, st,
reason: 'KakaoAccount loginWithKakaoAccount network
error',
fatal: false,
);
throw LoginException(
type: LoginErrorType.network,
message: "네트워크 연결을 확인해주세요",
);
}
} catch (e, st) {
if (e is LoginException) {
rethrow;
}
debugPrint("[kakao] Unexpected error: $e");
FirebaseCrashlytics.instance.recordError(
e, st,
reason: 'Kakao login unexpected error',
fatal: false,
);
throw LoginException(
type: LoginErrorType.unknown,
message: "카카오 로그인 초기화에 실패했습니다",
);
}
}
추정 원인
저희 쪽에서 디버깅한 결과, loginWithKakaoTalk()이 PlatformException(CANCELED)를 반환하는 것으로 추정하고 있습니다.
근거:
- 앱이 재시작되지 않음 (기존 화면 유지) → 앱 kill이 아님
- 에러 메시지(스낵바)가 표시되지 않음 → LoginException 경로가 아님
- 버튼이 다시 활성화됨 → 메서드가 정상 완료됨
위 코드에서 에러 메시지 없이 가입 화면에 머무르는 경로는 CANCELED로 인해 return false되는 경우뿐입니다.
이전에 동의를 완료한 사용자가 loginWithKakaoTalk 호출 시, 카카오톡 앱이 즉시 콜백을 보내는 과정에서 SDK가 이를 CANCELED로 처리하는 것이 아닌지 의심하고 있습니다.