kakao / kakao_flutter_sdk

Flutter SDK for Kakao Open API
Apache License 2.0
193 stars 70 forks source link

ios에서 카카오톡 앱으로 로그인 후 반응이 없습니다. #25

Closed whatamelon closed 4 years ago

whatamelon commented 4 years ago

_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');

} catch (e) {
  print('에러3 ? $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 버전입니다.

저희 앱에서 카카오톡앱으로 진입후, 페이스 아이디까지 인증 후 다시 저희 앱으로 돌아오는데 값은 같이 돌아오지 않는 현상이 발생합니다.

웹으로 했을때는 잘됩니다.

확인부탁드립니다. 그리고 좋은 라이브러리 만들어주셔서 감사합니다 ^^

whatamelon commented 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문으로 분기를 태울 수 있을까요?

CoderSpinoza commented 4 years ago

@whatamelon

보통 이런 경우 url 값 자체가 특정 포맷을 가지고 있기 때문에 직접 값을 체크할 수 있을 것 같아요. 카카오 로그인의 경우 redirect uri 의 값이 kakao${native_app_key}://oauth 형식이기 때문에 직접 분기를 해서 해당 경우에는 네이버 관련 코드를 호출하지 않으면 어떨까요?

whatamelon commented 4 years ago

그렇다면 redirect uri 를 어느 부분에서 잡는것이 좋을까요? 네이버나 카카오 버튼을 눌렀을때 shared_preferences에 값을 넣고 AppDelegate.swift에서 값을 꺼내서 위에 기술한 코드를 if else 문으로 감싸서 분기를 태워도 될까요?

CoderSpinoza commented 4 years ago

네 그렇게 하셔도 될 것 같아요. Shared_preferences 를 이용하는 방식 말고 global variable을 사용하는 방법도 있구요!

제가 제안드린 방식은 별도의 상태를 저장할 필요 없이 저 함수 내에서 argument로 들어온 url 값 자체를 비교하는 방식입니다. 현재 네이버 SDK의 url 을 핸들하는 delegate에서 kakao 로 시작하는 url 이 들어오면 return false 를 하시면, kakao_fluttersdk 에서 등록한 delegate에서 자동으로 처리를 해주지 않을까 싶어요.

요 이슈 혹시 해결하셨나요?

github-actions[bot] commented 4 years ago

Stale issue message

whatamelon commented 4 years ago

늦은 답변 죄송합니다ㅠㅠ 해당 이슈는 복합적인 이유들로 인해 네이버 로그인을 하지 않는걸로 해결하고 넘어갔습니다.

anychhoice commented 3 years ago

혹시라도 위 설정 방법을 궁금해하시는 분이 계실까 남깁니다.

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
    }
}
jpoh281 commented 3 years ago

@cyc2303 혹시 이부분 관련해서 도움을 좀 주실수있나요?? 네이버와 함께 쓰는게 안되서요 ..

anychhoice commented 3 years ago

@jpoh281 꽤 돼서 기억이 잘 안나는데, 주석 부분에

result = NaverThirdPartyLoginConnection.getSharedInstance().application(app, open: url, options: options)

이런식으로 처리해주시면 됩니다.

jpoh281 commented 3 years ago

@cyc2303 이렇게 사용하니 카카오 앱으로 로그인하는경우 동의하고 돌아오는 와중에 종료되어 버립니다. 오래되었다고 하시니 기억이 안나셔도 어쩔수없지만 혹시나 추가적으로 더 설정하신 부분이 있으신가요?

anychhoice commented 3 years ago

@jpoh281 코드 전체를 보여주세요

jpoh281 commented 3 years ago

AppDelegate.swift에 image 이렇게 사용했습니다.

anychhoice commented 3 years ago

네이버 관련 부분을 지웠을 때는 잘 동작하나요?

jpoh281 commented 3 years ago

예 네이버부분 뿐만아니라 카카오 관련된 부분들 모두 빼면 카카오는 정상작동합니다. 네이버는 로그인 못하구요

anychhoice commented 3 years ago

저는 import NaverThirdPartyLogin을 명시적으로 작성하지 않았습니다. 또, return NaverThirdPartyLoginConnection...의 형태로 사용하지 않고, 위에 말씀드린 대로 사용했습니다.

카카오 관련된 부분을 모두 빼면 카카오는 정상 작동합니다 -> 무슨말씀이신지 이해가 안 되는데요 네이버 로그인은 어느 플러그인으로 어떻게 처리하고 계신지 따라서 해결방법이 달라질 것 같으니, 네이버 로그인 플러그인과 이 플러그인의 사용방법을 좀 더 숙지하시는 걸 추천드립니다

jpoh281 commented 3 years ago

@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
      }

}

이렇게 작성하니까 잘 작동하네요. 당시에 도와주셔서 감사합니다.