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

求助:Swift UIWebView浏览器URL无效时自动跳转Google搜索实现

解决UIWebView输入无效URL崩溃并自动跳转Google搜索的方案

嘿,这个问题我之前也碰到过!咱们一步步来搞定——既要避免崩溃,又要自动引导到Google搜索结果,核心就是利用UIWebView的代理捕获加载失败的场景,再配合URL预处理和搜索逻辑就能实现需求。

第一步:设置代理并预处理用户输入的URL

首先得让你的视图控制器遵守UIWebViewDelegate协议,同时在加载URL前做个简单预处理:补全HTTP/HTTPS协议,这能减少大半无效URL的情况。

第二步:捕获加载失败事件并触发搜索

当UIWebView加载失败时,webView(_:didFailLoadWithError:)代理方法会被调用。我们可以在这里筛选出“找不到主机”“无法连接”这类典型的页面无法访问错误,然后自动触发Google搜索。

完整代码示例

class BrowserViewController: UIViewController, UIWebViewDelegate {
    @IBOutlet weak var webView: UIWebView!
    @IBOutlet weak var urlTextField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 必须设置代理,否则捕获不到加载失败事件
        webView.delegate = self
    }
    
    // 用户点击加载按钮时触发的方法
    @IBAction func loadTargetURL(_ sender: UIButton) {
        guard let inputContent = urlTextField.text, !inputContent.trimmingCharacters(in: .whitespaces).isEmpty else {
            // 处理空输入,比如给用户个提示
            return
        }
        
        // 预处理URL:补全HTTP/HTTPS协议
        var targetURLString = inputContent
        let hasValidScheme = targetURLString.lowercased().hasPrefix("http://") || targetURLString.lowercased().hasPrefix("https://")
        if !hasValidScheme {
            targetURLString = "https://\(targetURLString)"
        }
        
        // 尝试构造合法URL并加载
        if let validURL = URL(string: targetURLString) {
            let request = URLRequest(url: validURL)
            webView.loadRequest(request)
        } else {
            // 如果完全无法构造URL,直接跳转到Google搜索
            launchGoogleSearch(with: inputContent)
        }
    }
    
    // UIWebView加载失败的代理方法
    func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {
        let nsError = error as NSError
        // 筛选出"找不到页面"类的错误
        let unreachableErrors = [NSURLErrorCannotFindHost, NSURLErrorCannotConnectToHost, NSURLErrorNotConnectedToInternet]
        if nsError.domain == NSURLErrorDomain && unreachableErrors.contains(nsError.code) {
            guard let userInput = urlTextField.text else { return }
            launchGoogleSearch(with: userInput)
        }
        
        // 打印错误信息方便调试
        print("页面加载失败: \(error.localizedDescription)")
    }
    
    // 封装Google搜索逻辑
    private func launchGoogleSearch(with query: String) {
        // 对搜索关键词做URL编码,避免特殊字符导致链接失效
        guard let encodedQuery = query.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
            return
        }
        let searchURLString = "https://www.google.com/search?q=\(encodedQuery)"
        if let searchURL = URL(string: searchURLString) {
            let searchRequest = URLRequest(url: searchURL)
            webView.loadRequest(searchRequest)
        }
    }
}

额外注意事项

  • 关于UIWebView的弃用:苹果已经在iOS 12后弃用了UIWebView,后续推荐迁移到WKWebView,它的性能和安全性更优。如果迁移,对应的加载失败代理是webView(_:didFailProvisionalNavigation:withError:),逻辑和上面基本一致。
  • 错误类型扩展:你可以根据需求把更多错误码加入unreachableErrors数组,比如要处理404错误的话,需要额外通过webView(_:shouldStartLoadWith:navigationType:)拦截响应头来判断(UIWebView代理无法直接捕获HTTP状态码)。
  • 空输入处理:代码里加入了空输入判断,避免无意义的加载操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:03:37