안녕하세요.
webview_flutter: ^3.0.4 이용해서 하이브리드 앱을 만들고 있습니다.
카카오 로그인 부분에서 원래는 웹뷰화면으로 요렇게 잘 출력이 됬는데
원래 잘되던 코드가 어느 순간 갑작이 안되서 질문을 드립니다.
웹뷰에서 링크를 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>