当使用loadRequest来读取本地的资源时,WKWebView是无法读取成功的,后台会出现如下的提示:
Could not create a sandbox extension for /
原因是WKWebView是不允许通过的loadRequest的方法来加载本地根目录的资源文件。
而在iOS9的SDK中加入了以下方法来加载本地的HTML文件:
[WKWebView loadFileURL:allowingReadAccessToURL:]
但是在iOS9以下的版本是没提供这个便利的方法的以下为解决方案的思路,就是在iOS9以下版本时,先将本地文件的数据复制到tmp目录中,然后再使用的loadRequest来加载。
// 9.0以下将文件夹copy到tmp目录
- (NSURL *)fileURLForBuggyWKWebView:(NSURL *)fileURL {
NSError *error = nil;
if (!fileURL.fileURL || ![fileURL checkResourceIsReachableAndReturnError:&error]) {
return nil;
}
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *temDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory()];
[fileManager createDirectoryAtURL:temDirURL withIntermediateDirectories:YES attributes:nil error:&error];
NSURL *dstURL = [temDirURL URLByAppendingPathComponent:fileURL.lastPathComponent];
[fileManager removeItemAtURL:dstURL error:&error];
[fileManager copyItemAtURL:fileURL toURL:dstURL error:&error];
return dstURL;
}
// 加载本地资源
- (void)loadFileURL:(NSString *)fileURL {
NSString *readAccessToURL = [fileURL stringByDeletingLastPathComponent];
if (@available(iOS 9.0, *)) {
[self.wkWebView loadFileURL:[NSURL fileURLWithPath:fileURL] allowingReadAccessToURL:[NSURL fileURLWithPath:readAccessToURL]];
} else { // 9.0以下
if(fileURL) {
NSURL *fileUrl = [NSURL fileURLWithPath:fileURL];
// 把文件夹转到tmp目录
fileUrl = [self fileURLForBuggyWKWebView:fileUrl];
NSURL *realUrl = [NSURL fileURLWithPath:fileUrl.path];
NSURLRequest *request = [NSURLRequest requestWithURL:realUrl];
[self.wkWebView loadRequest:request];
}
}
}
网友评论