iOS WKWebView加载本地文件之权威解说

  在实际的iOS开发中,我们有很多的地方需要通过WKWebView加载本地的文件。但是由于WKWebview存在着一些跨域的问题。UIWebView直接加载的方法不能正常使用了。这里就和大家分享一下常见的几种处理方法。

GCDWebServer启动本地服务器加载

  就是在本地启动一个本地服务器,可以使用GCDWebServer这个库,大家感兴趣的话可以看看。GCDWebServer介绍的文章(https://www.jianshu.com/p/534632485234)

将文件复制到沙盒tmp文件夹下

  将文件复制一份到沙盒中的tmp文件夹下进行访问。具体代码如下:

 // Fallback on earlier versions
            NSString *filePath = [NSString stringWithFormat:@"%@%@",JKSandBoxPathTemp,[NSURL URLWithString:self.url].lastPathComponent];
            self.tempDirectoryFilePath = filePath;
            [JKSandBoxManager copyFileFrom:[NSURL URLWithString:self.url].path to:filePath];
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL fileURLWithPath:filePath] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:20];
            [_webView loadRequest:request];

这种做法的好处是iOS8 之后的操作系统都可以使用。坏处就是每次都需要进行复制,而且关闭页面后需要删除复制的文件。反复操作增大耗电量,减少内存的使用寿命。其中JKSandBoxManager下载地址如下:https://github.com/xindizhiyin2014/JKSandBoxManager

使用iOS9 之后的加载方法

  使用iOS9 之后新出的方法去加载,这个相对来说比较的简单。具体代码如下:

  WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
   [config.preferences setValue:@YES forKey:@"allowFileAccessFromFileURLs"];
   _webView = [[WKWebView alloc] initWithFrame:self.view.bounds
                                  configuration:config];

if ([self.url hasPrefix:@"file://"]) {
        if (@available(iOS 9.0, *)) {
            NSURL *accessURL = [[NSURL URLWithString:self.url] URLByDeletingLastPathComponent];
            [_webView loadFileURL:[NSURL URLWithString:self.url] allowingReadAccessToURL:accessURL];
        }
  }

这些方法我这边都已经检测过了,已经集成到了线上的app,大家可以放心使用哦。

更多优质文章,可以微信扫码关注:
这里写图片描述

你可能感兴趣的:(Object-C,IOS)