在os / x上使用新的闪亮的WKWebView和沙箱,需要一些干预重置或清除,因为后续调用加载文件URL将被忽略;这与之前关于WKWebView loadFileURL works only once的问题有点相关 - ios那里,这里是os / X我做的
if loadURL.isFileURL {
webView.loadFileURL(loadURL, allowingReadAccessTo: loadURL)
}
else
{
webView.load(URLRequest(url: loadURL))
}
我试图通过loadURL.deletingLastPathComponent()
作为第二个arg,但随后所有中断 - 没有文件URL被加载,也没有使用用户的主路径,或整个根'file:///'
,也没有'临时'异常re:绝对文件路径。最后,尝试干预topLoading()没有任何影响。
获取后续文件URL的唯一解决方案(yuck)是首先加载非文件URL!
在沙箱环境中,这会产生意想不到的后果吗?
嗯,这很有用 - 但是很丑陋 - webView子类函数,因为在以前加载文件网址时你不能重复使用webView。这个解决方法将实例化一个新窗口/ doc扔旧 - 除非作为用户首选项,他们想要保留旧窗口(newWindows标志为true):
func loadNext(url: URL) {
let doc = self.window?.windowController?.document as! Document
let newWindows = UserSettings.createNewWindows.value
var fileURL = url
if !url.isFileURL {
if newWindows {
do
{
let next = try NSDocumentController.shared().openUntitledDocumentAndDisplay(true) as! Document
let oldWindow = self.window
let newWindow = next.windowControllers.first?.window
(newWindow?.contentView?.subviews.first as! MyWebView).load(URLRequest(url: url))
newWindow?.offsetFromWindow(oldWindow!)
}
catch let error {
NSApp.presentError(error)
Swift.print("Yoink, unable to create new url doc for (\(url))")
return
}
}
else
{
self.load(URLRequest(url: url))
}
}
if let origURL = (fileURL as NSURL).resolvedFinderAlias() {
fileURL = origURL
}
if appDelegate.isSandboxed() && !appDelegate.storeBookmark(url: fileURL) {
Swift.print("Yoink, unable to sandbox \(fileURL))")
return
}
if !(self.url?.isFileURL)! && !newWindows {
self.loadFileURL(fileURL, allowingReadAccessTo: fileURL)
doc.update(to: fileURL, ofType: fileURL.pathExtension)
return
}
// We need or want a new window; if need, remove the old afterward
do {
let next = try NSDocumentController.shared().openUntitledDocumentAndDisplay(true) as! Document
let oldWindow = doc.windowControllers.first?.window
let newWindow = next.windowControllers.first?.window
(newWindow?.contentView?.subviews.first as! MyWebView).loadFileURL(fileURL, allowingReadAccessTo: fileURL)
if newWindows {
newWindow?.offsetFromWindow(oldWindow!)
}
else
{
newWindow?.overlayWindow(oldWindow!)
oldWindow?.orderOut(self)
}
next.update(to: fileURL, ofType: fileURL.pathExtension)
}
catch let error
{
NSApp.presentError(error)
Swift.print("Yoink, unable to new doc (\(fileURL))")
}
}