如何修复iOS中UIWebView的nsurlconnection错误码1100
我来帮你分析下这个问题——毕竟跨端加载本地资源时,iOS的WebView确实经常会有一些容易踩的坑。先理清楚你的场景:项目通过加载HTML字符串调用JS,进而加载服务器下载到本地的缓存内容,Android端正常运行,但iOS不管用UIWebView还是换成WKWebView都加载失败,调试发现触发了两次1100错误,而且报错指向的文件明明实际存在。
先贴出你提供的核心代码:
self.webContentView.delegate = self; NSString* html = [player getHTMLString]; NSString* baseURL = [player getBaseURLPath]; [self.pageLoadingActivity startAnimating]; [self.webContentView loadHTMLString:html baseURL: [NSURL URLWithString: baseURL]];
下面是我整理的几个排查方向和解决方案,你可以逐一尝试:
1. 先解决baseURL的解析问题(大概率是根源)
你现在用[NSURL URLWithString: baseURL]来创建本地路径的URL,这是个常见错误!URLWithString:是专门用来处理HTTP/HTTPS这类网络URL的,本地文件路径应该用fileURLWithPath:,否则很可能解析出无效的URL,导致WebView找不到目标文件。
修改代码试试:
// 确保baseURL是缓存文件所在的目录路径,isDirectory设为YES NSURL *baseURL = [NSURL fileURLWithPath:[player getBaseURLPath] isDirectory:YES]; [self.webContentView loadHTMLString:html baseURL:baseURL];
另外,顺便检查下应用对缓存目录的读写权限——虽然iOS默认允许访问自己的Documents目录,但如果文件是下载后移动过来的,权限可能出现异常。可以加段代码打印权限信息:
NSString *cacheDir = [player getBaseURLPath]; NSError *error; NSDictionary *dirAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:cacheDir error:&error]; if (dirAttrs) { NSLog(@"缓存目录权限:%@", dirAttrs[NSFilePosixPermissions]); } else { NSLog(@"获取目录权限失败:%@", error); }
正常权限应该是0755或0700,如果权限不对,用setAttributes:ofItemAtPath:error:调整即可。
2. 深挖1100错误的触发原因
WebKit的1100错误对应NSURLErrorFileDoesNotExist,但你说文件存在,那大概率是这两个问题:
- 路径包含特殊字符:检查那个
.cache.html文件的路径里有没有空格、中文或者非ASCII字符,有的话要对路径做URL编码后再传给WebView。 - 请求URL与实际路径不一致:在
shouldStartLoadWithRequest方法里,把request.URL完整打印出来,看看有没有被转义、截断,或者和你预期的路径不一致的地方。
3. WKWebView的专属排查点
如果你用WKWebView,还要额外注意:
- WKWebView对本地资源的跨域限制更严格,确保HTML里的JS/CSS资源都是相对路径,且baseURL正确指向资源所在目录。
- 尝试跳过
loadHTMLString:,直接用loadFileURL:加载那个缓存的HTML文件,看看能不能正常显示:
// 替换成你实际的缓存文件路径 NSString *cacheFilePath = @"/Users/ealpha4tech/Library/Developer/CoreSimulator/Devices/2CA71983-9996-44D6-944F-34E3EAFAE96D/data/Containers/Data/Application/6A19ABBA-CB68-4EE4-AC02-6AD3CB8A5A68/Documents/icplayer/icplayer/D2D6AFFF93CB2CFCB1640484F5429D89.cache.html"; NSURL *fileURL = [NSURL fileURLWithPath:cacheFilePath]; // 允许访问该文件所在的整个目录 NSURL *accessDirURL = [fileURL URLByDeletingLastPathComponent]; [self.webContentView loadFileURL:fileURL allowingReadAccessToURL:accessDirURL];
如果这个方法能正常加载,说明问题肯定出在loadHTMLString:的baseURL设置上。
4. 检查HTML字符串里的资源引用
最后,把[player getHTMLString]返回的HTML内容打印出来,看看里面的<script>、<link>、<img>等标签的路径是否正确。如果这些资源的相对路径和baseURL不匹配,WebView会去错误的路径找资源,也可能触发1100错误。
内容的提问来源于stack exchange,提问作者RR_Pradhan

