플러터에서 웹뷰사용시 카카오로그인 호출 문제

안녕하세요.
webview_flutter: ^3.0.4 이용해서 하이브리드 앱을 만들고 있습니다.

카카오 로그인 부분에서 원래는 웹뷰화면으로 요렇게 잘 출력이 됬는데
image
원래 잘되던 코드가 어느 순간 갑작이 안되서 질문을 드립니다.

웹뷰에서 링크를 MainActivity.kt로 넘겨서 처리를 하는데
var intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
이 부분에서 intent.dataString로 내용을 확인해보니 null을 반환합니다.

변환하기 전 url 내용을 보면 대략적으로 요런식으로 시작합니다.

intent:#Intent;action=com.kakao.talk.intent.action.CAPRI_LOGGED_IN_ACTIVITY;launchFlags=0x08880000;S.com.kakao.sdk.talk.appKey=... 

혹시 어떤 원인때문에 그런건지… 조언을 구합니다…!

main.dart

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: WebView(
            initialUrl: '192.168.0.30:3000',
            javascriptMode: JavascriptMode.unrestricted,
            userAgent: "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Mobile Safari/537.36",
            navigationDelegate: (request) async {
              Uri uri = Uri.parse(request.url);
              String finalUrl = request.url;

              // 웹뷰 브라우저에서 접근 가능한 주소(https 등)라면 URL로 이동
              if (uri.scheme == 'http' || uri.scheme == 'https' || uri.scheme == 'about') {
                return NavigationDecision.navigate;
              }

              if (Platform.isAndroid) {
                // Android는 Native(Kotlin)로 URL을 전달해 Intent 처리 후 리턴
                await _convertIntentToAppUrl(finalUrl).then((value) async {
                  finalUrl = value;  // 앱이 설치되었을 경우
                });
                try {
                  await launchUrlString(finalUrl);
                }
                catch(e){  // URL 실행 불가 시, 앱 미설치로 판단하여 마켓 URL 실행
                  finalUrl= await _convertIntentToMarketUrl(request.url);
                  launchUrlString(finalUrl);
                }
              } else if(Platform.isIOS){
                launchUrlString(finalUrl);
              }
              return NavigationDecision.prevent;
            }
        ),
      ),
    );
  }

  Future<String> _convertIntentToAppUrl(String text) async {
    return await channel.invokeMethod('getAppUrl',  <String, Object>{'url': text});
  }

  Future<String> _convertIntentToMarketUrl(String text) async {
    return await channel.invokeMethod('getMarketUrl',  <String, Object>{'url': text});
  }

MainActivity.kt

MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when {
                // Intent 스킴 URL을 안드로이드 웹뷰에서 접근가능하도록 변환
                call.method.equals("getAppUrl") -> {
                    val url: String = call.argument("url")!!
                  
                    var intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
                    //여기서 Null이 뜸

                    result.success(intent.dataString)
                }

                // Intent 스킴 URL을 playStore Market URL로 변환
                call.method.equals("getMarketUrl") -> {
                    val url: String = call.argument("url")!!
                    val packageName = Intent.parseUri(url, Intent.URI_INTENT_SCHEME).getPackage()
                    val marketUrl = Intent(
                            Intent.ACTION_VIEW,
                            Uri.parse("market://details?id=$packageName")
                    )
                    result.success(marketUrl.dataString)
                }
            }
        }

AndroidManifest.xml

        <queries>
            <package android:name="com.kakao.talk" />
        </queries>

해결했습니다.

 val fallbackUrl = intent.getStringExtra("browser_fallback_url")
                    if (fallbackUrl != null) {
                        result.success(fallbackUrl);
                    }

fallbackurl을 타니깐 잘 실행되네요

1개의 좋아요