"kakao_flutter_sdk" 사용하여 Kakao Login 관련 문의

안녕하세요. 상세히 잘 작성해주신 덕분에 Kakao 서비스 잘 활용하고 있습니다. 먼저 감사하다는 말씀 드립니다.

사용 관련하여 “Kakao Social Login” 서비스를 활용중에 있습니다.

제 환경은 다음과 같습니다.

  • SDK 버전: 1.4.1 (kakao_flutter_sdk 및 user …)
  • Platform: iOS / Android
  • Flutter Version: 3.7.10
  • Dart Version: 2.19.6
  • 앱 ID: 751145
  • 서비스 명: 이모만세

이슈는 다음과 같습니다.

  1. Android / iOS 앱 실행하여 Kakao Login 로직 실행
  2. isKakaoTalkInstalled() 메서드 true 인 경우,await UserApi.instance.loginWithKakaoTalk() 메서드 호출하여 OAuthToken 획득 시도
  3. 카카오톡 실행된 이후 바로, 저희 서비스(이모만세) 호출되어 켜짐

이 상태에서 어떤 로그도 남지않고 oauthToken 도 획득하지 못하고 있습니다.
(추가정보로, Web 을 통한 접속 “UserApi.instance.loginWithKakaoAccount()” 의 경우 정상적으로 로그인되고 토큰도 획득하고 있습니다.)

어떤 부분이 이슈인지 로그를 볼 수 없어서 이렇게 도움을 요청드립니다.

부족한 설명이나 정보 말씀해주시면, 추가적으로 전달드리겠습니다.

긴 글 읽어주셔서 감사합니다.

안녕하세요, 카카오 개발자는 아니지만 저랑 비슷한 현상을 겪고 계신거 같아 댓글 남깁니다.

혹시 token을 받는 line에 breakpoint를 넣어주시고 dev 앱 실행을 해보실수 있을까요?

작성하신 글의 내용을 보면 저와 같이 token 값이 null인것 같아 내용 남깁니다.

안녕하세요

말씀주신 내용을 봤을 때는 프로젝트 설정이 제대로 되어있지 않은 것으로 보이는데요, 가이드 참고하셔서 프로젝트 설정 확인 부탁드리고, 구현하신 로그인 코드 첨부 부탁드리겠습니다

추가로 현재 이슈가 있는 환경에 대해서 조금 헷갈리는데요, 앱 개발 상황에서 이슈가 발생한건지, 웹 개발 상황에서 이슈가 발생한건지 궁금합니다. 그리고 android, ios 중 어떤 환경에서 이슈가 있는 것인지도 궁금합니다.

네 가이드 다시 한 번 참고해보고 프로젝트 설정 확인해보겠습니다.

현재 이슈는 앱 개발 중에 발생했습니다. iOS / Android 플랫폼 에서 발생했습니다.
웹 개발 상황은 아닙니다. 다만, 웹으로는 접속된다고 말씀드린 부분은 else 분기문이 동작하는 것을 말씀드리려고 웹이라는 용어를 사용했습니다.

if (await isKakaoTalkInstalled()) {
  // 카카오톡이 설치된 경우, 카카오톡 앱을 실행하여 로그인 시도
  ...
  oauthToken = await UserApi.instance.loginWithKakaoTalk();
  ...
} else {
  // 카카오톡이 설치되어 있지 않은 경우, 기본 브라우저를 통해 로그인 시도.
  ...
  oauthToken = await UserApi.instance.loginWithKakaoAccount();
  ...
}

위 코드 중에서 현재 정상동작안하는 케이스가 아래코드 입니다.

if (await isKakaoTalkInstalled()) {
  // 카카오톡이 설치된 경우, 카카오톡 앱을 실행하여 로그인 시도
  ...
  oauthToken = await UserApi.instance.loginWithKakaoTalk(); // <--
  ...
}

이 코드가 호출 되고, 카카오톡 앱 기동까지는 정상적으로 되나, 그 이후 아무런 로직이 동작하지 않고 있습니다.

에러로그는 다음과 같습니다.

[Common] Snapshot request 0x280dc7f90 complete with error: <NSError: 0x280d72bb0; domain: FBSSceneSnapshotErrorDomain; code: 2; reason: "the request was denied">
[Common] Snapshot request 0x280da3720 complete with error: <NSError: 0x280da29a0; domain: BSActionErrorDomain; code: 6 (anulled)>

카카오톡 로그인이 호출되는 메서드 소스코드 공유드립니다.

  @override
  Future<OAuthToken?> login() async {
    OAuthToken? oauthToken;
    if (await isKakaoTalkInstalled()) {
      try {
        oauthToken = await UserApi.instance.loginWithKakaoTalk();
        print('카카오톡으로 로그인 성공');
        return oauthToken;
      } catch (error) {
        print('카카오톡으로 로그인 실패 $error');

        // 사용자가 카카오톡 설치 후 디바이스 권한 요청 화면에서 로그인을 취소한 경우,
        // 의도적인 로그인 취소로 보고 카카오계정으로 로그인 시도 없이 로그인 취소로 처리 (예: 뒤로 가기)
        if (error is PlatformException && error.code == 'CANCELED') {
          return null;
        }
        // 카카오톡에 연결된 카카오계정이 없는 경우, 카카오계정으로 로그인
        try {
          oauthToken = await UserApi.instance.loginWithKakaoAccount();
          print('카카오계정으로 로그인 성공');
          return oauthToken;
        } catch (error) {
          print('카카오계정으로 로그인 실패 $error');
          return null;
        }
      }
    } else {
      try {
        oauthToken = await UserApi.instance.loginWithKakaoAccount();
        print('카카오계정으로 로그인 성공');
        return oauthToken;
      } catch (error) {
        print('카카오계정으로 로그인 실패 $error');
        return null;
      }
    }
  }

부족한 부분 피드백주시면, 추가적으로 공유드리겠습니다.

감사합니다.

이 부분 말씀해주신 것 맞을까요?
스크린샷 2023-07-12 오후 12.34.15

저는 sdk 내부의 함수까지는 들여다보진 않았고, UserApi.instance.loginWIthKakao로 받으신 token 값을 할당한 variable 의 라인에 breakpoint를 적용하여 토큰값이 null인지 아닌지 확인해보았습니다.

예시
OAuthToken? token = await.UserApi.instance.loginWithKakao 로 확인하시면될거 같습니다

답변 감사합니다.

말씀해주신 토큰 획득을 위한 메서드 호출하고, 아예 crash 가 된 것인지, 어떤 Response 도 오지 않습니다.

제 코드상으로 보면 토큰을 획득하든 안하든 print 문이 호출되어야 하지만, 아예 지나가질 않더라구요. (breakpoint 도 마찬가지) 그래서 디버깅을 못해보고 있습니다 ㅠㅠ

 oauthToken = await UserApi.instance.loginWithKakaoTalk();
        print('카카오톡으로 로그인 성공');

답변이 조금 늦었습니다ㅠㅠ

서버 로그를 확인했을 때는 iOS 환경에서만 '카카오톡으로 로그인’을 실행하신 것으로 보이는데요, 안드로이드 환경에서도 '카카오톡으로 로그인’을 실행하신 것이 맞나요?

실행하지 않으셨다면 안드로이드 디바이스로도 확인 부탁드리겠습니다.

추가로 말씀하신 현상을 봤을 때 iOS 환경 설정이 제대로 되어있지 않을 때와 동일해서 환경설정 문제의 가능성이 있을 것 같습니다.
저에게 개인 메시지로 iOS 환경 설정한 내용 보내주시면 확인해보도록 하겠습니다

이메일 보내주신 것 확인했을 때 설정상의 문제는 없어보이네요.

첨부해주신 내용을 보니 네이버 로그인 플러그인도 같이 사용하시는 것으로 보이는데요, 해당 플러그인 혹은 다른 플러그인 설정에 의해 이슈가 발생했을 가능성이 있어보여서 AppDelegate 파일도 확인이 필요할 것 같습니다.

번거로우시겠지만 AppDelegate 파일 전문 첨부해주시면 감사하겠습니다

말씀해주신 AppDelegate 의 메서드 분기처리 이후에, 정상적으로 동작합니다.

AppDelegate.swift 코드는 다음과 같습니다.

import UIKit
import Flutter
import NaverThirdPartyLogin

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        GeneratedPluginRegistrant.register(with: self)
        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
        }
        
        application.registerForRemoteNotifications()
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

// 변경한 부분    
    override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if url.absoluteString.hasPrefix("kakao"){
            super.application(app, open:url, options: options)
            return true
        } else if url.absoluteString.contains("thirdPartyLoginResult") {
            NaverThirdPartyLoginConnection.getSharedInstance().application(app, open: url, options: options)
            return true
        } else {
            return true
        }
    }
}

도움 주셔서 감사합니다.

1개의 좋아요