求助: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
相关产品推荐
相关产品推荐

