沙箱& WKWebView loadFileURL(_,allowsReadAccessTo :)不一致

时间:2017-12-28 23:59:49

标签: macos wkwebview appstore-sandbox

在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!

在沙盒环境中,这会产生意想不到的后果吗?

1 个答案:

答案 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))")
    }
}