Swift中UIWebView因URL缺失http/https崩溃的解决方案咨询
解决UIWebView加载无协议URL崩溃的问题
嘿,这个问题我太熟了——很多刚接触UIWebView的开发者都会踩这个坑!核心原因很简单:UIWebView无法处理不带HTTP/HTTPS协议的URL字符串。当你直接把www.example.com这种格式的字符串传给NSURL初始化时,它会返回nil,而UIWebView拿到nil的请求就会直接崩溃。
下面给你两种语言的具体解决方案,从根源上避免崩溃:
1. 先给URL补全协议并校验有效性
写一个工具方法,自动给不带协议的URL加上HTTPS(现在优先推荐HTTPS,也可以根据需求换成HTTP),同时校验URL是否有效。
Objective-C 版本
- (NSURL *)validURLFromString:(NSString *)urlString { // 空字符串直接返回nil if (!urlString.length) return nil; // 检查字符串是否已有HTTP/HTTPS前缀 BOOL hasProtocol = [urlString.lowercaseString hasPrefix:@"http://"] || [urlString.lowercaseString hasPrefix:@"https://"]; if (!hasProtocol) { // 补全HTTPS协议 urlString = [NSString stringWithFormat:@"https://%@", urlString]; } NSURL *url = [NSURL URLWithString:urlString]; // 额外校验URL的scheme和host是否存在,确保是有效URL if (url && url.scheme && url.host) { return url; } return nil; }
Swift 版本
func validURL(from urlString: String?) -> URL? { guard let urlString = urlString, !urlString.isEmpty else { return nil } let lowercasedURL = urlString.lowercased() let hasProtocol = lowercasedURL.hasPrefix("http://") || lowercasedURL.hasPrefix("https://") let formattedURLString = hasProtocol ? urlString : "https://\(urlString)" guard let url = URL(string: formattedURLString), url.scheme != nil, url.host != nil else { return nil } return url }
2. 加载前判断URL有效性,避免传nil给UIWebView
拿到用户输入的字符串后,先用上面的工具方法生成有效URL,确认非nil后再传给UIWebView加载,同时给用户友好的错误提示。
Objective-C 加载示例
// 假设这是用户输入的URL字符串 NSString *userInput = @"www.example.com"; NSURL *validURL = [self validURLFromString:userInput]; if (validURL) { NSURLRequest *request = [NSURLRequest requestWithURL:validURL]; [self.webView loadRequest:request]; } else { // 提示用户输入的URL无效 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"请输入有效的URL(支持直接输入域名,或带http/https前缀)" preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; }
Swift 加载示例
// 假设这是用户输入的URL字符串 let userInput = "www.example.com" guard let validURL = validURL(from: userInput) else { // 提示用户无效 let alert = UIAlertController(title: "提示", message: "请输入有效的URL(支持直接输入域名,或带http/https前缀)", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) return } let request = URLRequest(url: validURL) webView.loadRequest(request)
额外提醒
虽然UIWebView已经被苹果弃用(iOS 12之后官方推荐使用WKWebView),但这个问题在WKWebView中同样存在——传入nil的请求也会引发异常,所以上面的校验逻辑同样适用于WKWebView的场景。
内容的提问来源于stack exchange,提问作者Miloo
相关产品推荐
相关产品推荐

