Flutter 웹뷰에서 카카오 로그인 시도시 intent.dataString 이 null 이 반환되는 문제

안녕하세요 flutter inAppWebView를 이용해 하이브리드 앱을 만들고 있습니다.
웹뷰에서 카카오 로그인 버튼을 누르면 카카오톡 앱을 실행시키고 싶지만 intent로 파싱을 시도할시에 intent.dataString이 null 로 반환되어 카카오톡 앱을 실행 시킬 수 없습니다.
url 수신은 flutter 쪽에서 하고 intent 파싱은 코틀린코드로 했습니다.
앱쪽 코드는 카카오 하이브리드 문서를 참고해서 작성하였습니다.

데브톡에 올라온 유사한 이슈
위 이슈와 같은 내용의 이슈로 추측됩니다.

안녕하세요.

파싱하신 코드와, 파싱전 전달된 내용 공유 부탁드립니다.

파싱코드

val url: String? = call.argument("url")
                val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
                result.success(intent.dataString)

전달 받은 intent url

intent:#Intent;action=com.kakao.talk.intent.action.CAPRI_LOGGED_IN_ACTIVITY;launchFlags=0x08880000;S.com.kakao.sdk.talk.appKey=a7385cbb67ce28a800d6e2da0c75d96e;S.com.kakao.sdk.talk.redirectUri=https://dev.chicruiting.com/auth/kakao/callback;S.com.kakao.sdk.talk.kaHeader=sdk/2.5.0%20os/javascript%20sdk_type/javascript%20lang/ko-KR%20device/Linux_aarch64%20origin/https%3A%2F%2Fdev.chicruiting.com;S.com.kakao.sdk.talk.extraparams=%7B%22client_id%22%3A%22a7385cbb67ce28a800d6e2da0c75d96e%22%2C%22redirect_uri%22%3A%22https%3A%2F%2Fdev.chicruiting.com%2Fauth%2Fkakao%2Fcallback%22%2C%22response_type%22%3A%22code%22%2C%22auth_tran_id%22%3A%22VWFWXCNE_UD0USYofIKTG3IyN1XknqEXHh1f2S6JKkiJOAd6tPjXyEzQAT2K%22%2C%22is_popup%22%3Atrue%7D;S.browser_fallback_url=https%3A%2F%2Fkauth.kakao.com%2Foauth%2Fauthorize%3Fclient_id%3Da7385cbb67ce28a800d6e2da0c75d96e%26redirect_uri%3Dhttps%253A%252F%252Fdev.chicruiting.com%252Fauth%252Fkakao%252Fcallback%26response_type%3Dcode%26auth_tran_id%3DVWFWXCNE_UD0USYofIKTG3IyN1XknqEXHh1f2

안녕하세요. 답변이 조금 늦었네요ㅠㅠ

말씀해주신 상황을 제대로 정확하게 이해하지 못했습니다.
하이브리드 앱을 개발 중이라고 하셨는데 ‘카카오톡 로그인’ 버튼을 눌렀을 때 수신되는 url은 어디서 전달해주는건가요?
웹 페이지에서 JavaScript용 카카오SDK를 사용하고 계신건지, 혹은 kakao_flutter_sdk를 사용하고 계신건지 잘 몰라서 현재 구현이 어떻게 되어있는지 파악하기가 어렵습니다.

사용 중인 SDK가 어떤 것인지 설명 부탁드리고, 로그인 버튼을 눌렀을 때의 플로우를 조금만 더 자세히 설명주시면 감사하겠습니다

JavaScript용 SDK 를 사용해서 구현했습니다.
웹쪽에서 “카카오 로그인 버튼” 을 클릭하면 Kakao.Auth.authorize() 함수를 호출하고,
앱쪽에서는 shouldOverrideUrlLoading 함수에서 수신되는 url 을 Intent.parseUri 로 파싱해서 사용합니다.

구현 상황 대략적으로 이해했습니다.

InAppWebView 클래스의 shouldOverrideUrlLoading 를 구현할 때, request.url의 scheme이 intent인 경우 String 값으로 변환해 메소드 채널로 android 단으로 전달해주고, android 단에서는 전달받은 String 값을 Intent.parseUri() 를 사용해 Intent 로 변환한 뒤에 startActivity() 를 호출해주는 방식으로 구현하면 정상적으로 동작할 것으로 보여요. (하이브리드 문서에서도 intent.dataString을 사용하지는 않습니다)

대략적인 코드는 아래와 같고, 단순 예제 수준의 코드라서 참고만 하시는 것을 권장합니다.

  • flutter
InAppWebView(
  // 나머지 부분 생략
  shouldOverrideUrlLoading:
    (controller, navigationAction) async {
      var uri = navigationAction.request.url!;

      if (uri.scheme == 'intent') {
        final result = await channel.invokeMethod('launchIntent', {'url': uri.toString()});
        return NavigationActionPolicy.CANCEL;
      }
  // 나머지 부분 생략
);
  • android
// 나머지 부분 생략

MethodChannel(
    flutterEngine.dartExecutor.binaryMessenger,
    CHANNEL_NAME
).setMethodCallHandler { call, result ->
    when (call.method) {
        "launchIntent" -> {
            val url = call.argument("url") ?: ""
            val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
            startActivity(intent)
            result.success(true)
        }

        else -> {
            result.notImplemented()
        }
}

이 때 카카오톡 앱의 설치 유무, 미설치 시 browser_fallback_url 등을 활용해 카카오계정 로그인을 할 수 있도록 구현하면 더 좋을 것 같습니다. 이 점도 참고하시면 좋을 것 같아요.

안드로이드13 이후의 버전에서 카카오톡 앱이 실행되지 않습니다.
에러코드도 발생하지 않고 있습니다.
코드는 다음과 같습니다.

추가적으로 문서에 있는대로 로그를 찍었을때 pakage 의 값은 null 이 출력됩니다.

  val url = call.argument("url") ?: ""
                val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
                if (intent.resolveActivity(packageManager) != null) {
                    startActivity(intent)
                    Log.d("startActivity", "ACTIVITY: ${intent.`package`}")
                }

안녕하세요

intent 값은 어떻게 출력되나요?

추가로 말씀하신 '문서’가 어떤건가요?