Flutter kakao login시 loginWithKakaoTalk()이 정상동작하지 않습니다

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


현재 카카오 앱 아이디는 350224 이며
pubspec은 다음과 같습니다:

name: ddib
flutter:
  ...
environment:
  sdk: ">=3.0.0 <4.0.0"
  flutter: "^3.19.4"

dependencies:
  ...
  kakao_flutter_sdk: 1.8.0
  ...


dev_dependencies:
  ...

info.plist는 다음과 같습니다:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<!-- 생략 -->
	<key>CADisableMinimumFrameDurationOnPhone</key>
	<true/>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>app</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>$(FLUTTER_BUILD_NAME)</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleURLTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeRole</key>
			<string>Editor</string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>kakao<!-- 생략 --></string>
			</array>
		</dict>
	</array>
	<key>CFBundleVersion</key>
	<string>$(FLUTTER_BUILD_NUMBER)</string>
	<key>FirebaseAppDelegateProxyEnabled</key>
	<true/>
	<key>FirebaseScreenReportingEnabled</key>
	<true/>
	<key>ITSAppUsesNonExemptEncryption</key>
	<false/>
	<key>KAKAO_APP_KEY</key>
	<string><!-- 생략 --></string>
	<key>LSApplicationQueriesSchemes</key>
	<array>
		<string>kakaokompassauth</string>
		<string>storykompassauth</string>
		<string>kakaolink</string>
		<string>kakaotalk-4.5.0</string>
		<string>kakaostory-2.9.0</string>
		<string>kftc-bankpay</string>
		<string>ispmobile</string>
		<string>itms-apps</string>
		<string>hdcardappcardansimclick</string>
		<string>smhyundaiansimclick</string>
		<string>shinhan-sr-ansimclick</string>
		<string>smshinhanansimclick</string>
		<string>kb-acp</string>
		<string>mpocket.online.ansimclick</string>
		<string>ansimclickscard</string>
		<string>ansimclickipcollect</string>
		<string>vguardstart</string>
		<string>samsungpay</string>
		<string>scardcertiapp</string>
		<string>lottesmartpay</string>
		<string>lotteappcard</string>
		<string>cloudpay</string>
		<string>nhappcardansimclick</string>
		<string>nonghyupcardansimclick</string>
		<string>citispay</string>
		<string>citicardappkr</string>
		<string>citimobileapp</string>
		<string>kakaotalk</string>
		<string>payco</string>
		<string>lpayapp</string>
		<string>hanamopmoasign</string>
		<string>wooripay</string>
		<string>nhallonepayansimclick</string>
		<string>hanawalletmembers</string>
		<string>chaipayment</string>
		<string>kb-auth</string>
		<string>hyundaicardappcardid</string>
		<string>com.wooricard.wcard</string>
		<string>lmslpay</string>
		<string>lguthepay-xpay</string>
		<string>liivbank</string>
		<string>supertoss</string>
		<string>newsmartpib</string>
		<string>naversearchthirdlogin</string>
	</array>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
		<key>NSAllowsArbitraryLoadsInWebContent</key>
		<true/>
	</dict>
	<key>UIApplicationSupportsIndirectInputEvents</key>
	<true/>
	<key>UIBackgroundModes</key>
	<array>
		<string>fetch</string>
		<string>processing</string>
		<string>remote-notification</string>
	</array>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIMainStoryboardFile</key>
	<string>Main</string>
	<key>UIStatusBarHidden</key>
	<false/>
	<key>UIStatusBarStyle</key>
	<string>UIStatusBarStyleDarkContent</string>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UIViewControllerBasedStatusBarAppearance</key>
	<false/>
	<key>io.flutter.embedded_views_preview</key>
	<true/>
</dict>
</plist>

iOS 17.4.1 기준으로 다음 코드를 통해 카카오 유저 정보를 얻어옵니다:

final isKakaoInstalled = await isKakaoTalkInstalled();
var credential = isKakaoInstalled
    ? await UserApi.instance.loginWithKakaoTalk()
    : await UserApi.instance.loginWithKakaoAccount();
return credential;

카카오 앱이 설치되지 않은 환경에서 loginWithKakaoAccount는 정상동작하지만, loginWithKakaoTalk를 실행할 경우에는 예외도 throw되지 않고 무한히 hang이 걸립니다. (kakao_flutter_sdk 1.9.1+2, 1.9.0, 1.8.0 모두에서 해당 이슈가 발생합니다.

해당 이슈에 대해 도움을 받고 싶습니다!

안녕하세요

iOS 카카오톡 로그인의 경우 유니버셜 링크를 사용하고 있습니다. 아래의 링크 참고해서 동일 증상인지, 동일한 증상이라면 가이드대로 따라했을 때 해결이 되는지 확인 부탁드리겠습니다

@tony.mb 다른 증상입니다. 카카오톡을 실행하고, 카카오톡애서의 인증까지는 종료되지만 앱으로 응답이 오지 않습니다.

@tony.mb 추가로, xcode를 통해서 디바이스 로그를 확인하면 다음과 같은 내용이 확인됩니다. 크게 중요하지 않아 보이지만 도움이 될 까 하여 첨부해 드립니다. 해당 메시지로 유추해 보면 native codebase 단에서 저희 앱이 다시 호출되고 url 파라미터를 수신하는 것까지는 정상 동작하는 것으로 보입니다.:

flutter: unhandled element <filter/>; Picture key: Svg loader
10.24.0 - [FirebaseAnalytics][I-ACS023001] Deep Link does not contain valid required params. URL params: {
    code = "-생략-";
}

또한 저희 AppDelegate.swift의 내용은 다음과 같습니다:

import Flutter
import UIKit
func getPlist(withName name: String) -> [String]? {
  if let path = Bundle.main.path(forResource: name, ofType: "plist"),
    let xml = FileManager.default.contents(atPath: path)
  {
    return
      (try? PropertyListSerialization.propertyList(
        from: xml, options: .mutableContainersAndLeaves, format: nil)) as? [String]
  }
  return nil
}

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

  override func application(
    _ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
  ) {
    if #available(iOS 10.0, *) {
      UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
    }
  }

  override func application(
    _ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
    fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
  ) {
    if #available(iOS 10.0, *) {
      UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
    }

  }
}

@tony.mb 추가로 확인해 본 결과, app_links 플러그인을 사용중인데, 해당 플러그인이 유니버셜 앱 링크를 가져가고 있기 때문인 것으로 보입니다. AppDelegate 단에서 kakao_flutter_sdk로 유니버셜 링크로 들어온 인증 결과를 넘겨주려면 어떻게 해야 하나요? 추가로 안드로이드를 위한 kotlin 코드도 필요할 경우 알려주시면 감사할 것 같습니다!

app_links를 추가해서 이슈 재현해보려고 하는 중에 발견했는데 블로그 포스팅 참고하시면 좋을 것 같습니다!

추가로 안드로이드는 별도의 추가 설정 없이 정상적으로 동작할 것으로 보여요

@tony.mb 마침 저도 해당 아티클을 읽은 참입니다(적극적으로 조사해 주셔서 감사합니다 ㅜㅜ) 다만 해당 아티클에서 앞부분에는 해당 플러그인의 코드베이스만 분석하시고 정작 중요한 부분을 ‘마지막에 카카오톡 인증코드를 따로 어떻게 처리하면 된다.’ 라고 적어두셔서(;:wink: application 함수 안에서 플러그인으로 해당 uri를 전달하는 방법을 알려주시면 감사하겠습니다! 저도 그동안 깃헙 레포지터리에서 flutter kakao sdk의 ios 코드를 직접 읽으면거 해걀법을 유추하고 있겠습니다!

1개의 좋아요

@leejh10003 app_links 가이드 참고해서 수정했을 때 정상 동작하는지 확인 부탁드리겠습니다

import app_links

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)

    // Retrieve the link from parameters
    if let url = AppLinks.shared.getLink(launchOptions: launchOptions) {
      // We have a link, propagate it to your Flutter app
      AppLinks.shared.handleLink(url: url)
      return true // Returning true will stop the propagation to other packages
    }

    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

@tony.mb 우선 app_links 버전을 4.0.1로 내려서 해결했답니다. 파이어베이스 다이나믹 링크 서비스 종료로 해당 플러그인 사용이 필요한 사용자가 늘어날 것으로 보이는 만큼, 해당 레포지터리 관계자와 협의해 두 버전 사이의 차이가 뭔지 조사후 알려 드리겠습니다:hugs:

해당 코드는 application(:didFinishLaunchingWithOptions) 오버로딩이 있을 때, 작성된 코드로 인해 app_links 익스텐션이 정상 동작하지 않는 경우를 방지하기 위한 코드라고 합니다. 해당 코드를 추가하기 전에도 이미 app_links는 정상 동작 중이었기 때문에 해당 코드가 문제는 일단 아닌 것으로 판단됩니다.

1개의 좋아요

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

application(_:didFinishLaunchingWithOptions:) 구현에 의해서 application(_:open:options:) 동작이 달라질 수 있기 때문에 해당 가이드를 전달드렸던건데 app_links의 내부 코드까지 확인해보니 이슈 해결이 안될 것 같네요…
잘못된 답변 드려 혼란스럽게 해드린 점 죄송합니다.ㅠㅠ

해당 이슈는 kakao_flutter_sdk 에서 자체적으로는 해결할 수 없는 이슈로 보여서 이 부분 양해 부탁드리고 동일한 이슈가 발생한다면 app_links 쪽에 문의하시는 것이 좋을 것 같습니다.

@tony.mb 열심히 도와주셔서 감사드려요 :heart_eyes:. 저도 app_links 패키지의 iOS 네이티브 코드를 확인해 봤더니 다소 단순하게 해결해 둔 것 같더라구요… 해당 이슈는 현재 해당 패키지의 깃헙 레포지터리에 이슈로 작성해 둔 상태입니다. 해결되면 본 스레드에도 알려 드리겠지만, 궁금하시다면 이 이슈를 방문하여 직접 확인하실 수 있습니다!

1개의 좋아요

@tony.mb 이 부분이 좀 중요할거 같은데, 개발팀에서 관심부탁드립니다. 화이팅!!! ^^

1개의 좋아요

계속 관심 갖고 확인해보도록 하겠습니다.
감사합니다.

@dev143 @nefone525
안녕하세요

최근에 제보주신 현상에 대해서 app_links 측에 제보했고, app_links 측에서도 버그임을 인지해서 이슈 수정한 6.0.2 버전이 릴리즈 되었습니다.

app_links 6.0.2 버전 사용하시면 제보주신 현상이 해결될 것으로 보여서 참고 부탁드립니다.

감사합니다!

안녕하세요.
내용 확인하고, 테스트 확인 했습니다.
이전처럼 정상동작 합니다.

이렇게 빨리 해결될지 예상을 못했는데, 정말 감사합니다. ^^
좋은 하루 보내세요.

1개의 좋아요