与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,而无需任何解决方法?
答案 0 :(得分:31)
针对Swift 4,Xcode 9.3
进行了更新此方法允许WKWebView正确读取链接的CSS,JS和大多数其他文件的目录和子目录的层次结构。您 NOT 需要更改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转到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 - 没有成功。