카카오계정으로 로그인은 잘 작동하나, 카카오톡으로 로그인이 작동하지 않는 문제

문의 시 사용하시는 SDK 버전 정보와 플랫폼(Android / iOS) 및 디벨로퍼스 앱ID를 알려주세요.


안녕하세요
flutter로 카카오로그인을 적용하였는데,
iOS에서
k.OAuthToken token = await k.UserApi.instance.loginWithKakaoAccount();
이 코드는 토큰을 잘 갖고 오는데,
k.OAuthToken token = await k.UserApi.instance.loginWithKakaoTalk();
이 코드를 사용하면 동의 화면에서 동의 확인 버튼을 누른 이후 다시 앱 화면으로 돌아온 후에 반응이 없습니다.
(breakpoint로 확인해도 위 코드에서 중단됩니다)

어떤 문제일까요?

유사한 질문에 대해 iOS 설정들을 확인해보라고 돼 있어서 모두 확인은 했는데도 계속 증상이 발생합니다.
URL Schemes 부분도 캡처합니다.
앱 id는 774797입니다.
토큰이 발행됐는지라도 체크할 수 있을까요?

안녕하세요

AppDelegate.swift 파일 전문 첨부가 가능할까요?

https://devtalk.kakao.com/t/kakao-flutter-sdk/121852

위의 이슈와 비슷한 상황인 것으로 보이네요

1개의 좋아요

안녕하세요?
말씀하신 것처럼 해당 이슈와 동일한 문제였던 것 같습니다. 왜 ‘같습니다’라고 하냐면…

해당 글에 있던 내용으로 AppDelegate.swift 내용을 전부 변경했더니 빌드 과정에서 아래와 같은 에러가 발생했습니다.

Could not build the precompiled application for the device. Swift Compiler Error (Xcode): Optional type ‘Bool?’ cannot be used as a boolean; test for '!= nil’ instead

위의 에러가 발생한 위치를 보니 naver와 관련된 코드같아서 해당 코드인
if !result {
result = NaverThirdPartyLoginConnection.getSharedInstance()?.application(app, open: url, options: options)
}

이 부분을 주석처리하고 빌드하였더니 빌드도 잘 되고 loginWithKakaotalk도 잘 작동합니다!!!
감사드립니다!!! :grin: :heart_eyes:

혹시 위 에러의 발생 원인도 좀 알 수 있을까요? 구글링을 해봐도 잘 모르겠더라구요. 초보 개발자라 ㅠㅠ
네이버 로그인 관련 설정이 제대로 완료되지 않아서 일까요?

1개의 좋아요

자문자답입니다.
.getSharedInstance()? 부분에서 ?를 빼고 빌드하니 잘 되네요.

감사합니다~!! ^^

1개의 좋아요

해결되어서 다행이네요ㅎㅎ

AppDelegate.swift를 첨부해주시지는 않아서 아래의 코드를 예시로 간단하게 설명드리겠습니다

import UIKit
import Flutter
import NaverThirdPartyLogin

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {

  override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
      var result = false

     if url.absoluteString.hasPrefix("kakao") {
         result = super.application(app, open: url, options: options)
     }

     if !result {
         result = NaverThirdPartyLoginConnection.getSharedInstance()?.application(app, open: url, options: options)
     }
     return result
  }
}

위 코드에서 application(_:open:options:)은 커스텀 URL에 의해 앱이 실행되었을 때 호출되는 메서드 입니다. (‘카카오톡으로 로그인’ 기능은 kakao${app_key} 형태의 커스텀 URL을 사용하기 떄문에 카카오톡에서 개발 중인 앱으로 다시 돌아왔을 때 application 메소드가 실행됩니다)

application(_:open:options:) 메소드는 다른 패키지들(ex - kakao_flutter_sdk, flutter_naver_login 등)에서도 해당 패키지의 로직 처리를 위해 오버라이딩 하는 경우가 많습니다.

예를 들어 kakao_flutter_sdk, flutter_naver_login을 사용하는 앱이라고 하면 총 3개의 application 메소드가 있는 상황이라고 할 수 있는데요, 커스텀 URL을 통해 앱으로 전환되었을 때 앱 내에 구현된 application, 그 뒤로는 패키지에 구현된 application 메소드 순서로 호출됩니다. (패키지들의 application 메소드 호출 순서는 보장할 수 없습니다)

application 메소드는 리턴 값을 어떻게 설정하는지에 따라서 하위 application 을 호출할지 말지를 결정하는데요, 이전에는 네이버 로그인이 아님에도 NaverThirdPartyLoginConnection.getSharedInstance().application(app, open: url, options: options) 호출 결과에 의해 kakao_flutter_sdk의 application 메소드가 정상적으로 실행되지 않았습니다.

따라서 위 코드는 kakao_flutter_sdk의 application 메소드가 정상적으로 처리될 수 있도록 수정한 코드입니다

1개의 좋아요

우와오~ 쉽고 자세한 설명 너무 감사합니다.
저같은 초보에게는 큰 도움이 됩니다. 꼼꼼히 읽어보고 완전히 이해하도록 하겠습니다.

좋은 하루 보내세요!! :grin:

1개의 좋아요