Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
whatamelon opened this issue Apr 28, 2020 · 16 comments
Closed

Comments

@whatamelon
Copy link

_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 whatamelon changed the title ios에서 카카오톡 앱으로 로그인 후 답이 없습니다. ios에서 카카오톡 앱으로 로그인 후 반응이 없습니다. Apr 28, 2020
@whatamelon
Copy link
Author

확인해보니
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
Copy link
Contributor

CoderSpinoza commented Apr 30, 2020

@whatamelon

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

@whatamelon
Copy link
Author

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

@CoderSpinoza
Copy link
Contributor

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

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

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

@github-actions
Copy link

Stale issue message

@whatamelon
Copy link
Author

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

@anychhoice
Copy link

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

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
Copy link

jpoh281 commented Nov 19, 2020

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

@anychhoice
Copy link

anychhoice commented Nov 19, 2020

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

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

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

@jpoh281
Copy link

jpoh281 commented Nov 19, 2020

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

@anychhoice
Copy link

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

@jpoh281
Copy link

jpoh281 commented Nov 19, 2020

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

@anychhoice
Copy link

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

@jpoh281
Copy link

jpoh281 commented Nov 19, 2020

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

@anychhoice
Copy link

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

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

@jpoh281
Copy link

jpoh281 commented Feb 25, 2021

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

}

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants