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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:15:09