You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native WebView中Android App Link被当作URL无法唤起银行APP问题咨询

解决方案

核心实现逻辑

你不需要提前预置银行域名白名单,完全依托Android系统的App Link校验能力处理即可,具体逻辑如下:

  • 重写WebView的shouldOverrideUrlLoading方法,拦截所有加载的URL
  • 对每个拦截到的HTTPS/HTTP URL,构造标准的ACTION_VIEW Intent,设置对应URL和Intent.FLAG_ACTIVITY_NEW_TASK标记
  • 调用系统的resolveActivity方法检测是否存在可以直接处理该Intent的非浏览器类应用:
    • 如果存在匹配的App,直接启动该Intent唤起对应银行应用,返回true拦截WebView的加载行为
    • 如果不存在匹配的App,返回false让WebView继续加载该URL(也就是跳转到银行官网)

注意:需要给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:18:03