在os / x上使用新的闪亮WKWebView和沙箱,需要一些干预重置或清除,因为后续调用加载文件URL将被忽略;这与WKWebView loadFileURL works only once的早期问题有些相关 - 我在那里,在os / X上我做
if loadURL.isFileURL {
webView.loadFileURL(loadURL, allowingReadAccessTo: loadURL)
}
else
{
webView.load(URLRequest(url: loadURL))
}
我试图传递loadURL.deletingLastPathComponent()
作为第二个arg但是然后所有中断 - 没有文件网址被加载,也没有使用用户的主路径,或整个根'file:///'
,也没有临时'异常re:绝对文件路径。最后,尝试干预topLoading()没有任何影响。
获取后续文件URL的唯一解决方案(yuck)是首先加载非文件URL!
在沙盒环境中,这会产生意想不到的后果吗?
答案 0 :(得分:0)
嗯,这很有用但是很丑陋 - 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))")
}
}