React Native WebView中Android App Link被当作URL无法唤起银行APP问题咨询
解决方案
核心实现逻辑
你不需要提前预置银行域名白名单,完全依托Android系统的App Link校验能力处理即可,具体逻辑如下:
- 重写WebView的
shouldOverrideUrlLoading方法,拦截所有加载的URL - 对每个拦截到的HTTPS/HTTP URL,构造标准的
ACTION_VIEWIntent,设置对应URL和Intent.FLAG_ACTIVITY_NEW_TASK标记 - 调用系统的
resolveActivity方法检测是否存在可以直接处理该Intent的非浏览器类应用:- 如果存在匹配的App,直接启动该Intent唤起对应银行应用,返回
true拦截WebView的加载行为 - 如果不存在匹配的App,返回
false让WebView继续加载该URL(也就是跳转到银行官网)
- 如果存在匹配的App,直接启动该Intent唤起对应银行应用,返回
注意:需要给App添加
QUERY_ALL_PACKAGES权限(Android 11及以上),否则resolveActivity无法检测到设备上安装的第三方应用,如果你上架Google Play需要对该权限的使用做合规说明。
原生Android端代码示例
@Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { Uri url = request.getUrl(); // 只处理http/https链接,自定义scheme的深度链接可以按原有逻辑处理 if (url.getScheme().equals("http") || url.getScheme().equals("https")) { Intent intent = new Intent(Intent.ACTION_VIEW, url); intent.addCategory(Intent.CATEGORY_BROWSABLE); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 检测是否有非浏览器应用可以处理该App Link ResolveInfo resolveInfo = getContext().getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); if (resolveInfo != null && !isBrowserApp(resolveInfo.activityInfo.packageName)) { getContext().startActivity(intent); return true; } } return super.shouldOverrideUrlLoading(view, request); } // 辅助方法:判断包名是否是浏览器应用 private boolean isBrowserApp(String packageName) { // 常见浏览器包名可按需扩展,也可以通过Intent的CATEGORY_APP_BROWSER过滤 List<String> browserPackages = Arrays.asList( "com.android.chrome", "com.sec.android.app.sbrowser", "org.mozilla.firefox", "com.opera.browser", "com.microsoft.emmx" ); return browserPackages.contains(packageName); }
React Native react-native-webview 适配方案
如果你用的是社区版react-native-webview组件,可以通过自定义原生WebView组件,或者用onShouldStartLoadWithRequest回调结合原生模块实现:
- 在JS侧的
onShouldStartLoadWithRequest回调里拿到待加载的URL,传给你封装的原生检测模块 - 原生模块执行上述的
resolveActivity检测逻辑,将结果回调给JS侧 - 如果检测到有可处理的App,JS侧调用原生模块的唤起方法,同时返回
false拦截WebView加载 - 如果没有可处理的App,返回
true让WebView继续加载
额外适配点
- 如果你需要兼容iOS的Universal Link,逻辑完全一致,只需要把Android侧的检测逻辑替换为iOS的
canOpenURL方法即可 - 部分银行App可能没有配置App Link的自动验证,系统会弹出应用选择弹窗,属于正常系统行为,不需要额外处理
内容的提问来源于stack exchange,提问作者user1492867
相关产品推荐
相关产品推荐

