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

WebView应用开发需求:内部链接在App打开,外部链接走移动浏览器

嘿,这个需求我之前做过好多次了,核心就是精准区分内部链接和外部链接,然后给它们分配不同的跳转逻辑就行。下面我分Android和iOS两个主流平台给你具体的实现方案,你可以直接参考:

Android 实现方案

在Android里,我们主要通过WebView的shouldOverrideUrlLoading回调来拦截链接,判断后决定是内部加载还是跳浏览器:

  1. 首先定义你的内部站点前缀(如果支持多个内部域名,可改用集合存储):
private val INTERNAL_DOMAIN_PREFIX = "https://www.123.com"
  1. 重写WebView的链接拦截方法:
webView.webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
        val url = request?.url?.toString() ?: return super.shouldOverrideUrlLoading(view, request)
        
        // 判断是否是内部链接(含相对路径)
        return if (url.startsWith(INTERNAL_DOMAIN_PREFIX) || url.startsWith("/")) {
            // 内部链接:让WebView自行加载,返回false表示不拦截
            false
        } else {
            // 外部链接:调用系统浏览器打开
            val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
            startActivity(intent)
            true // 返回true表示我们自行处理了跳转
        }
    }

    // 适配API 24以下的旧版本Android
    override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
        url?.let {
            return if (it.startsWith(INTERNAL_DOMAIN_PREFIX) || it.startsWith("/")) {
                false
            } else {
                val intent = Intent(Intent.ACTION_VIEW, Uri.parse(it))
                startActivity(intent)
                true
            }
        }
        return super.shouldOverrideUrlLoading(view, url)
    }
}
iOS 实现方案

iOS用WKWebView的话,通过decidePolicyForNavigationAction回调来处理跳转逻辑:

  1. 定义内部站点前缀:
let internalDomainPrefix = "https://www.123.com"
  1. 设置WKWebView的导航代理并实现方法:
webView.navigationDelegate = self

// 扩展实现代理逻辑
extension YourViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        guard let url = navigationAction.request.url else {
            decisionHandler(.allow)
            return
        }
        
        let urlString = url.absoluteString
        // 判断是否为内部链接(含相对路径)
        if urlString.starts(with: internalDomainPrefix) || urlString.starts(with: "/") {
            // 内部链接:允许WebView加载
            decisionHandler(.allow)
        } else {
            // 外部链接:调用系统浏览器打开
            if UIApplication.shared.canOpenURL(url) {
                UIApplication.shared.open(url)
            }
            // 取消WebView的加载请求
            decisionHandler(.cancel)
        }
    }
}
额外注意点
  • 如果内部站点有多个域名(比如同时支持https://123.com和https://www.123.com),可以把前缀放到集合里,用any()方法批量判断匹配
  • 务必处理相对路径(比如/about这类),否则会被误判为外部链接
  • Android需要在Manifest中添加网络权限,iOS要在Info.plist中配置LSApplicationQueriesSchemes(如需兼容第三方浏览器跳转)

内容的提问来源于stack exchange,提问作者awais

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:33:03