Closed whatamelon closed 4 years ago
확인해보니 override func application(_ app: UIApplication, open url: URL, options:[UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { return NaverThirdPartyLoginConnection.getSharedInstance().application(app, open: url, options: options) }
이 코드를 사용하는 네이버 서드파티라이브러리때문에 생긴 문제였습니다. 네이버 서드 파티 라이브러리를 사용하기 위해서는 위의 코드가 필요하고, 카카오 로그인에서는 저 코드가 있으면 응답값이 오지 않습니다. 이런 경우에는 따로 if else문으로 분기를 태울 수 있을까요?
@whatamelon
보통 이런 경우 url 값 자체가 특정 포맷을 가지고 있기 때문에 직접 값을 체크할 수 있을 것 같아요. 카카오 로그인의 경우 redirect uri 의 값이 kakao${native_app_key}://oauth
형식이기 때문에 직접 분기를 해서 해당 경우에는 네이버 관련 코드를 호출하지 않으면 어떨까요?
그렇다면 redirect uri 를 어느 부분에서 잡는것이 좋을까요? 네이버나 카카오 버튼을 눌렀을때 shared_preferences에 값을 넣고 AppDelegate.swift에서 값을 꺼내서 위에 기술한 코드를 if else 문으로 감싸서 분기를 태워도 될까요?
네 그렇게 하셔도 될 것 같아요. Shared_preferences 를 이용하는 방식 말고 global variable을 사용하는 방법도 있구요!
제가 제안드린 방식은 별도의 상태를 저장할 필요 없이 저 함수 내에서 argument로 들어온 url 값 자체를 비교하는 방식입니다. 현재 네이버 SDK의 url 을 핸들하는 delegate에서 kakao 로 시작하는 url 이 들어오면 return false 를 하시면, kakao_fluttersdk 에서 등록한 delegate에서 자동으로 처리를 해주지 않을까 싶어요.
요 이슈 혹시 해결하셨나요?
Stale issue message
늦은 답변 죄송합니다ㅠㅠ 해당 이슈는 복합적인 이유들로 인해 네이버 로그인을 하지 않는걸로 해결하고 넘어갔습니다.
혹시라도 위 설정 방법을 궁금해하시는 분이 계실까 남깁니다.
AppDelegate.swift
파일을 다음과 같이 변경하면 됩니다.
import UIKit
import Flutter
import KakaoSDKAuth
import KakaoSDKCommon
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
if let appKey = Bundle.main.object(forInfoDictionaryKey: "KAKAO_API_KEY") as? String {
KakaoSDKCommon.initSDK(appKey: appKey)
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
override func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
var result = false
if AuthApi.isKakaoTalkLoginUrl(url) {
result = super.application(app, open: url, options: options)
}
if !result {
// 네이버 로그인, 페이스북 로그인, uni link 등등 처리
}
return result
}
}
@cyc2303 혹시 이부분 관련해서 도움을 좀 주실수있나요?? 네이버와 함께 쓰는게 안되서요 ..
@jpoh281 꽤 돼서 기억이 잘 안나는데, 주석 부분에
result = NaverThirdPartyLoginConnection.getSharedInstance().application(app, open: url, options: options)
이런식으로 처리해주시면 됩니다.
@cyc2303 이렇게 사용하니 카카오 앱으로 로그인하는경우 동의하고 돌아오는 와중에 종료되어 버립니다. 오래되었다고 하시니 기억이 안나셔도 어쩔수없지만 혹시나 추가적으로 더 설정하신 부분이 있으신가요?
@jpoh281 코드 전체를 보여주세요
AppDelegate.swift에 이렇게 사용했습니다.
네이버 관련 부분을 지웠을 때는 잘 동작하나요?
예 네이버부분 뿐만아니라 카카오 관련된 부분들 모두 빼면 카카오는 정상작동합니다. 네이버는 로그인 못하구요
저는 import NaverThirdPartyLogin
을 명시적으로 작성하지 않았습니다.
또, return NaverThirdPartyLoginConnection...
의 형태로 사용하지 않고, 위에 말씀드린 대로 사용했습니다.
카카오 관련된 부분을 모두 빼면 카카오는 정상 작동합니다
-> 무슨말씀이신지 이해가 안 되는데요
네이버 로그인은 어느 플러그인으로 어떻게 처리하고 계신지 따라서 해결방법이 달라질 것 같으니, 네이버 로그인 플러그인과 이 플러그인의 사용방법을 좀 더 숙지하시는 걸 추천드립니다
@cyc2303 11월에는 플러터를 시작한지 얼마 안되서 제대로 못했는데
import UIKit
import Flutter
import NaverThirdPartyLogin
import KakaoSDKAuth
import KakaoSDKUser
import KakaoSDKCommon
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
if let appKey = Bundle.main.object(forInfoDictionaryKey: "KAKAO_API_KEY") as? String {
KakaoSDKCommon.initSDK(appKey: appKey)
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
var result = false
NSLog("URL = \(url.absoluteString)");
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
}
}
이렇게 작성하니까 잘 작동하네요. 당시에 도와주셔서 감사합니다.
_loginWithTalk() async{ print('카톡 깔려있음.'); try { var authCode = await AuthCodeClient.instance.requestWithTalk(); print('토큰 가져옴? $authCode'); } on KakaoAuthException catch (e) { print('에러1 ? $e'); } on KakaoClientException catch (e) { print('에러2 ? $e');
}
xcode에서 디버그 해보니 이런 log가 나옵니다.
2020-04-28 14:10:41.199329+0900 pickling[961:213299] flutter: 카톡 깔려있음. 2020-04-28 14:10:46.153942+0900 pickling[961:213632] 6.23.0 - [Firebase/Analytics][I-ACS023001] Deep Link does not contain valid required params. URL params: { code = "DaBiLClhJsUuADyGUhSiTZDFyvwHr4JMPRoDmwM4Dj5E0-oiL8MLAtfIj7_uGjT7yJs2NQo9dZwAAAFxvzHUPg"; }
xcode - 11version, ios 13.4 버전입니다.
저희 앱에서 카카오톡앱으로 진입후, 페이스 아이디까지 인증 후 다시 저희 앱으로 돌아오는데 값은 같이 돌아오지 않는 현상이 발생합니다.
웹으로 했을때는 잘됩니다.
확인부탁드립니다. 그리고 좋은 라이브러리 만들어주셔서 감사합니다 ^^