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

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

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 등을 활용해 카카오계정 로그인을 할 수 있도록 구현하면 더 좋을 것 같습니다. 이 점도 참고하시면 좋을 것 같아요.