最近在研究WKWebview,发现在iOS8系统的真机上本地h5文件加载不了,而模拟器上是正常的。通过不断的打印日志打包在第三方测试平台上远程测试,发现h5文件根本没有加载,根据这条线索,在网上查找很多资料说iOS8要将h5的文件拷贝到temp目录下才能加载,于是我按照这种方法处理后再打包远程测试,webview还是加载不出来,通过观察日志,发现一条重要线索“Could not create a sandbox extension for'/'”,于是我想这有可能与h5文件的目录结构有关,将h5文件下的子目录下的文件全部移到h5目录下。再打包测试,完美解决问题(欢迎大家和我交流)。
总结:WKWebView 在iOS9及以上用户API
[self.wkwebViewloadFileURL:fileURLallowingReadAccessToURL:fileURL];
iOS8上用
NSURLRequest *request= [NSURLRequestrequestWithURL:fileURL];
[self.wkwebViewloadRequest:request];
而且iOS8上h5文件的目录下不要有子目录(不知道为啥,欢迎有知道的告知),文件全部放在一级目录下面,并且要将整个h5文件拷贝到temp目录上,经过测试发现只能拷贝到tmp目录,拷贝到caches目录下加载不到html文件,包括caches目录下的图片也无法正常加载(欢迎有知道原因的童鞋告知和指正,有错误之处欢迎拍砖)。以下附上代码:
//加载h5文件方法
- (void)loadHtml:(NSString *)html
{
NSString *urlStr = [[NSBundlemainBundle]pathForResource:htmlofType:nil];
//注意:html中包含了.html后缀若未包含则ofType参数需填写参数@“html”
NSLog(@"urlStr = %@",urlStr);
if(urlStr){
NSURL *fileURL = [NSURLfileURLWithPath:urlStr];
NSLog(@"fileURL = %@",fileURL);
if ([[UIDevicecurrentDevice].systemVersionfloatValue] >=9.0) {
[self.wkwebViewloadFileURL:fileURLallowingReadAccessToURL:fileURL];
} else {
//ios8以下特殊处理
NSURL *directoryUrl =[selffileURLForBuggyWKWebView8];
fileURL= [NSURL fileURLWithPath:[directoryUrl.relativePathstringByAppendingFormat:@"/%@",html]];
NSURLRequest *request= [NSURLRequestrequestWithURL:fileURL];
[self.wkwebViewloadRequest:request];
}
}
}
//将文件copy到tmp目录(经过测试发现只能拷贝到tmp目录 ,拷贝到caches目录下加载不到html文件,包括caches目录下的图片,欢迎有知道原因的童鞋告知)
- (NSURL*)fileURLForBuggyWKWebView8{
NSError *error = nil;
NSString *urlStr = [[NSBundlemainBundle]pathForResource:@"assets"ofType:nil];
NSURL *fileURL = [NSURLfileURLWithPath:urlStr];
// Create "/temp/www" directory
NSFileManager *fileManager= [NSFileManagerdefaultManager];
NSString *path = [NSTemporaryDirectory()stringByAppendingPathComponent:fileURL.lastPathComponent];
// NSURL *temDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory()];
NSURL *dstURL = [NSURLfileURLWithPath:path];
if ([fileManager fileExistsAtPath:path]) {
NSLog(@"已经存在文件");
return dstURL;
}
// [fileManager createDirectoryAtURL:temDirURLwithIntermediateDirectories:YES attributes:nil error:&error];
// Now copy given file to the tempdirectory
[fileManager removeItemAtURL:dstURLerror:&error];
[fileManager copyItemAtURL:fileURLtoURL:dstURLerror:&error];
// Files in "/temp/www" loadflawlesly :)
return dstURL;
}