Swift 加载本地web文件&;WKWebView中的资源
与UIWebView和以前版本的WKWebView(iOS 10和macOS 10.12)不同,本地文件的默认加载操作已从Swift 加载本地web文件&;WKWebView中的资源,swift,cocoa,cocoa-touch,webkit,wkwebview,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解决方案现在似乎将目录层次结构扁平化,
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,而无需任何解决方法?针对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文件的文件夹导入到项目的任意位置。确保您: ☑️ 如果需要,复制项目 ☑️ 创建文件夹引用(不是“创建组”) ☑️ 增加目标 步骤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)
–要加载的文件名(不带扩展名索引
).html
–web文件夹的名称(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)
}
}
如果你们有任何人对这个方法或代码有进一步的问题,我会尽力回答 这是我的工作:
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];
我面临的问题和我的情况一样,我正在下载一些 HTML内容,并将其保存到文档目录,然后 在应用程序中显示它。同一控制器使用实时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)
}
它非常适合我1,打开项目设置,进入构建阶段选项卡,打开链接二进制库。添加Webkit框架 2、将html添加到项目中(如果需要,复制项目) 3、将此项添加到代码中: @ibvar-webView:WKWebView 4、视图加载
使用
WKWebView
可以使用项目中的资源,甚至可以使用html代码中的共享库例如,我展示了如何从包含
ResourceContainingBundleClassName
类的bundle加载pic.png
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];
NSSTring*htmlCode=@”;
NSBundle*bundle=[NSBundle bundleForClass:[ResourceContainingBundleClassNamed];
NSURL*base=bundle.resourceURL;
WKWebView*表示=[WKWebView新建];
[表示loadHtmlString:htmlCode baseURL:base];
神奇之处在于
resourceURL
bundle属性。如果您只是获取所需文件的路径,则将其转换为URL-不成功。非常感谢。一直在努力寻找有效的解决方案!这也是将一个简单的HTML5(包括几个JS libs)应用程序包装到macOS应用程序中的方法吗?我不明白为什么还要调用.load(request)
。我认为loadFileURL()
是加载本地文件的首选方式,load(request)
是否做了额外的工作?我得到:致命错误:在展开可选值时意外发现nil。我能让它工作的唯一方法是,我将index.html放在与xcodeproj文件相同的文件夹中,并使用“/”作为子目录。您不需要调用load
。只需调用loadFileURL
。第二个load
没有意义。是否需要在委托方法中执行任何操作?我下载了一个PDF文件并保存到文档目录。我可以从模拟器的文档目录中预览PDF文件,但是wkWebView没有显示任何内容,也不知道为什么。我还遗漏了什么吗?对于pdf文件,您可以使用PDFKITT查看这里,非常感谢!我已经下载了本地文档目录文件夹中的图像,现在我有一个html字符串,其中包含img的最后一个路径组件,理想情况下保存在docDirectory中,如何将该字符串中的所有图像加载到wkwebview,请您指导我步骤。您以何种形式保存了html内容,我已分别保存了所有图像