加载本地Web文件& WKWebView

时间:2018-04-03 20:29:46

标签: swift cocoa cocoa-touch webkit wkwebview

与UIWebView和以前版本的WKWebView(iOS 10& macOS 10.12)不同,本地文件的默认加载操作已从Bundle.main.path移至Bundle.main.url。同样,loadFileURL也成为在WKWebView中加载本地资源的默认函数。

我知道.path.url完全不同,过去都有效 - .path历来是默认选择的方法;然而,似乎最新版本的Swift破坏了大多数(如果不是全部).path解决方案。 .path解决方案现在似乎展平目录层次结构,将所有CSS,JS和任何其他子目录内容放入一个大目录中。当WKWebView尝试加载index.html时会导致加载错误,例如,使用链接的子文件夹样式表(即/css/style.css)。

在看到无数问题和无数不确定/破碎的答案后,是否有一个快速而轻松的解决方案来实现可以加载本地资源(包括链接的CSS / JS文件)的WKWebView,而无需任何解决方法?

5 个答案:

答案 0 :(得分:31)

针对Swift 4,Xcode 9.3

进行了更新

此方法允许WKWebView正确读取链接的CSS,JS和大多数其他文件的目录和子目录的层次结构。您 NOT 需要更改HTML,CSS或JS代码。

解决方案(快速)

  1. 将web文件夹添加到项目中(文件>将文件添加到项目中)
    • 根据需要复制项目
    • 创建文件夹引用*
    • 添加到目标(适用)
  2. 将以下代码添加到viewDidLoad并根据您的需要对其进行个性化设置:

    let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "website")!
    webView.loadFileURL(url, allowingReadAccessTo: url)
    let request = URLRequest(url: url)
    webView.load(request)
    
  3. 解决方案(深入)

    第1步

    将本地Web文件的文件夹导入项目的任何位置。请确保你:

    Xcode > File > Add Files to "Project"

      

    ☑️根据需要复制项目

         

    ☑️创建文件夹引用 (不是“创建群组”)

         

    ☑️添加到目标

    第2步

    使用WKWebView转到View Controller,并将以下代码添加到viewDidLoad方法中:

    let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "website")!
    webView.loadFileURL(url, allowingReadAccessTo: url)
    let request = URLRequest(url: url)
    webView.load(request)
    
    • index - 要加载的文件的名称(不含.html扩展名)
    • website - 您的网络文件夹的名称(index.html应位于此目录的根目录)

    结论

    整体代码应如下所示:

    import UIKit
    import WebKit
    
    class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
    
        @IBOutlet weak var webView: WKWebView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            webView.uiDelegate = self
            webView.navigationDelegate = self
    
            let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "Website")!
            webView.loadFileURL(url, allowingReadAccessTo: url)
            let request = URLRequest(url: url)
            webView.load(request)
        }
    
    }
    

    如果您对此方法或代码有任何疑问,我会尽力回答!

答案 1 :(得分:5)

为我工作:

        WKWebView *wkwebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
        wkwebView.navigationDelegate = self;
        wkwebView.UIDelegate = self;
        [wkwebView.configuration.preferences setValue:@"TRUE" forKey:@"allowFileAccessFromFileURLs"];
        NSURL *url = [NSURL fileURLWithPath:YOURFILEPATH];
        [wkwebView loadFileURL:url allowingReadAccessToURL:url.URLByDeletingLastPathComponent];
        [self.view addSubview:wkwebView];

答案 2 :(得分:2)

我遇到了同样的问题,我正在下载 来自服务器的HTML内容,并将其保存到Document目录,然后 在应用程序内部显示它。同一控制器使用LIVE URL 我也不得不把条件与URL方案。 在iOS 13 Xcode 11上进行了测试

  if Url.scheme == "file" as String {
         wkWebView.loadFileURL(Url, allowingReadAccessTo: Url)
    }
    else {
         let request = URLRequest.init(url: Url, cachePolicy:.reloadIgnoringLocalCacheData, timeoutInterval:60)
         wkWebView.load(request)
    }

对我来说很完美

答案 3 :(得分:0)

1,打开项目设置,然后转到“构建阶段”选项卡,打开“链接二进制文件与库”。添加Webkit框架。

2,将html添加到您的项目中(如果需要,请复制项目)

3,将其添加到您的代码中: @IBOutlet弱var webView:WKWebView!

4,viewDidLoad viewDidLoad

答案 4 :(得分:0)

可以通过 WKWebView 在 html 代码中使用您项目中的资源甚至共享库。
例如,我展示了如何从包含 pic.png 类的包中加载 ResourceContainingBundleClassNamed

NSSTring * htmlCode = @"<img src='pic.png'>";
NSBundle * bundle = [NSBundle bundleForClass:[ResourceContainingBundleClassNamed class]];
NSURL * base = bundle.resourceURL;
WKWebView * represent = [WKWebView new];
[represent loadHtmlString: htmlCode baseURL: base];

神奇之处在于 resourceURL 捆绑属性。如果您只是获取所需文件的路径,则将其转换为 URL - 没有成功。