WKWebView 加载本地文件 hash 路由

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自己实现去

你可能感兴趣的:(WKWebView 加载本地文件 hash 路由)