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