Android11 WebView自定义URI scheme跳转APP失败(Flutter Twitter登录场景)
问题诱因
- Android 11(API 30)调整了WebView的默认URL处理逻辑:API 29及更低版本中,WebView遇到非标准的自定义Scheme时,会自动将请求提交给系统Intent分发体系,匹配对应注册的应用;API 30及以上版本中,WebView默认仅处理http、https、ftp、ws等标准网络协议,遇到未识别的自定义Scheme会直接抛出
net::ERR_UNKNOWN_URL_SCHEME错误,不会再触发系统Intent分发。 - Android 11新增了包可见性限制,如果应用targetSdkVersion>=30,未在Manifest中声明对应Scheme的查询权限,系统也无法匹配到你的应用作为跳转目标。
修复方案
分两步处理:
步骤1:适配WebView的Scheme拦截逻辑
根据你使用的WebView实现方式选择对应配置:
- 原生Android WebView场景:重写
shouldOverrideUrlLoading方法,手动拦截自定义Scheme并构造Intent跳转
@Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); if (url.startsWith("app_name://")) { try { Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); view.getContext().startActivity(intent); return true; } catch (Exception e) { // 无匹配应用的兜底逻辑 } } return super.shouldOverrideUrlLoading(view, request); }
- Flutter webview_flutter插件场景:通过
navigationDelegate拦截自定义Scheme,配合url_launcher跳转
WebView( initialUrl: twitterAuthUrl, navigationDelegate: (request) { if (request.url.startsWith('app_name://')) { launchUrl(Uri.parse(request.url)); return NavigationDecision.prevent; } return NavigationDecision.navigate; }, )
步骤2:适配Android 11包可见性规则
在AndroidManifest.xml的根节点(和application节点平级)添加如下配置:
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="app_name" /> </intent> </queries>
内容的提问来源于stack exchange,提问作者imamuu
相关产品推荐
相关产品推荐

