[Flutter/iOS] loginWithKakaoTalk 호출 시 카카오톡 앱이 열렸다가 즉시 돌아오며 로그인이 완료되지 않는 이슈

환경

  • kakao_flutter_sdk_user: 1.10.0
  • Flutter: 3.38.7 (stable)
  • Dart: 3.10.7
  • 대상 기기: 일부 iPhone (구형 아님, iOS 최신)
  • 디벨로퍼스 앱ID: 775109

Flutter 앱에서 카카오 로그인을 구현하고 있습니다.

일부 iOS 사용자에게서 아래 현상이 반복적으로 발생합니다.

loginWithKakaoTalk() 호출

  1. 카카오톡 앱이 열림
  2. 인증 화면 없이 즉시 원래 앱 가입 화면으로 돌아옴
  3. 로그인이 완료되지 않고 가입 화면에 머무름
  • 앱이 재시작(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로 처리하는 것이 아닌지 의심하고 있습니다.

안녕하세요

혹시 이슈 발생하는 디바이스 정보(모델명, OS 버전)를 알 수 있을까요?

처음 인입된 이슈이고, 재현되지 않아서 조금 더 파악이 필요할 것 같습니다.

iOS 버전: 26.6.1
모델명: iPhone 15 Pro Max
입니다.