카카오 로그인을 구현하고 잘 되는지 테스트까지 마친 후였는데 ..!! 어느 날 보니 갑자기 기능이 작동하지 않았다...
앱 미설치 시 링크(AuthCodeClient.instance.request())를 통해 로그인하는 로직은 잘 동작하는데 문제는 앱을 통한 로그인 기능(AuthCodeClient.instance.requestWithTalk())이 말썽이었다.
정상적이라면 동의창이 뜨고 동의하면 다시 개발 중인 앱으로 돌아가야 하는데, 카톡으로 이동한 후 동의화면도 뜨지 않은 채 바로 개발중인 앱으로 돌아오는 것이었다..
kakao developer 문의 결과 서버 로그에는 내쪽으로 토큰이 잘 발급되고 있다는 피드백을 받았다.
..? 대체 왜 안 되는데 그럼 .. 🤯
원인은 네이버 로그인을 추가하면서 카카오톡 로그인에 사용되는 url이 네이버 SDK에서 수신받아 처리되고 있는 것이었다.
import UIKit
import Flutter
import NaverThirdPartyLogin
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
return NaverThirdPartyLoginConnection.getSharedInstance().application(app, open: url, options: options)
}
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
네이버 로그인을 위해선 위와 같이 AppDelegate.swift에 NaverThirdPartyLoginConnection 관련 함수를 추가해야 한다.
카카오에서 받아오는 인증코드는 다음과 같은 딥링크 형태이다.
kakao{NATIVE_APP_KEY}://oauth?code=인증코드
url이 카카오 로그인을 위한 건지 네이버 로그인을 위한 건지를 구분하면 해결된다. (딥링크에 kakao가 포함됐는지 체크)
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
}
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}