一尘不染

在WKWebView中加载本地Web文件和资源

swift

与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

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


阅读 1597

收藏
2020-07-07

共1个答案

一尘不染

已为Swift 4,Xcode 9.3更新


通过此方法,WKWebView可以正确读取链接的CSS,JS和大多数其他文件的目录和子目录的层次结构。你 不是
需要改变你的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)


解决方案(深度)

第1步

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

Xcode>文件>将文件添加到“项目”

☑️如果需要复制项目

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

☑️添加到目标

第2步

使用WKWebView转到视图控制器,并将以下代码添加到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– Web文件夹的名称(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)
    }

}

如果您对这个方法或代码还有其他疑问,我会尽力回答!

2020-07-07