美文网首页打造基础的hybird的框架
WKWebView 加载本地文件 hash 路由

WKWebView 加载本地文件 hash 路由

作者: 黄成 | 来源:发表于2019-11-15 10:47 被阅读0次

    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 路由

        本文链接:https://www.haomeiwen.com/subject/qlpjictx.html