与UIWebView和WKWebView的早期版本(iOS 10和macOS 10.12)不同,本地文件的默认加载操作已从Bundle.main.path移至Bundle.main.url。同样,loadFileURL它也已成为在WKWebView中加载本地资源的默认功能。
Bundle.main.path
Bundle.main.url
loadFileURL
我知道,.path并且.url是完全不同的,都已经在过去的工作- .path在历史上是默认设置,选择的方法; 但是,似乎Swift的最新版本破坏了大多数(如果不是全部).path解决方案。现在,.path解决方案似乎可以 使 目录层次结构 扁平 化,将所有CSS,JS和任何其他子目录内容放入一个大目录中。当WKWebView尝试使用链接的子文件夹样式表(例如)加载index.html时,这将导致加载错误/css/style.css。
.path
.url
/css/style.css
在看到无数的问题和无数不确定/不匹配的答案之后,是否有一种快速而轻松的解决方案来实现WKWebView,它可以加载本地资源(包括链接的CSS / JS文件),而无需任何解决方法?
已为Swift 4,Xcode 9.3更新
通过此方法,WKWebView可以正确读取链接的CSS,JS和大多数其他文件的目录和子目录的层次结构。你 不是 需要改变你的HTML,CSS和JS代码。
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)
将本地Web文件的文件夹导入到项目中的任何位置。确保您:
☑️如果需要复制项目 ☑️ 创建文件夹引用 (不是“创建组”) ☑️添加到目标
☑️如果需要复制项目
☑️ 创建文件夹引用 (不是“创建组”)
☑️添加到目标
使用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
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) } }
如果您对这个方法或代码还有其他疑问,我会尽力回答!