WKWebView 加载本地文件
-
如果代码在mainbundle里面,直接使用
loadRequest:[NSURL fileWithPath:]
即可 -
如果代码在文件系统,比如
cache/dist/index.html
,直接使用loadFileURL:fileUrl allowingReadAccessToURL:[NSURL fileWithPath:]
即可 -
如果代码在文件系统,比如
cache/dist/index.html
,而且使用hash路由,最终访问的路径为cache/dist/index.html?#/router
,这时候使用第二种会直接返回错误, 使用NSURL fileURLWithPath: relativeToURL:
也是错误
对于第三种访问
使用 file://,然后使用 URLWithString:
如下
NSString *htmlPath = [NSString stringWithFormat:@"file://%@/index.html?#/login", targetFilePath];
NSURL *fileUrl = [NSURL URLWithString:htmlPath];
NSURL *accessUrl = [NSURL fileURLWithPath:targetFilePath];
[webView loadFileURL:fileUrl allowingReadAccessToURL:accessUrl];
完整示例
整体逻辑: 把mainbundle里面的 dist.bundle内容 拷贝到Cache/bundle/target.bundle,然后访问 Cache/bundle/target.bundle/index.html?#/login
//拷贝dist.bundle到cache file里面的bundle文件下target.bundle
NSString* bundleOriginPath = [[NSBundle mainBundle] pathForResource:@"dist" ofType:@"bundle"];
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *bundlePath = [path stringByAppendingString:@"/bundle"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if(![fileManager fileExistsAtPath:bundlePath]){
[fileManager createDirectoryAtPath:bundlePath withIntermediateDirectories:YES attributes:nil error:nil];
}
NSString * targetFilePath = [NSString stringWithFormat:@"%@/target.bundle", bundlePath];
NSError *error;
[fileManager removeItemAtPath:targetFilePath error:&error];//移除目标目录下该文件
NSError *error1;
[fileManager copyItemAtURL:[NSURL fileURLWithPath:bundleOriginPath] toURL:[NSURL fileURLWithPath:targetFilePath] error:&error1];
// 请求本地路径
NSString *htmlPath = [NSString stringWithFormat:@"file://%@/index.html?#/login", targetFilePath];
WKWebView *webView = [[WKWebView alloc]initWithFrame:self.view.bounds];
NSURL *fileUrl = [NSURL URLWithString:htmlPath];
NSURL *accessUrl = [NSURL fileURLWithPath:targetFilePath];
[webView loadFileURL:fileUrl allowingReadAccessToURL:accessUrl];
[self.view addSubview:view];
写在最后: 最后这个方法为什么能用,猜测是NSURL URLWithString对hash做了处理,但是fileURLWithPath并未处理。具体可以找大佬问问
demo自己实现去
网友评论