Sandbox和WKWebView loadFileURL(_,allowsReadAccessTo :)不一致

问题描述 投票:1回答:1

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

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

macos wkwebview appstore-sandbox
1个回答
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))")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.