【问题标题】:iOS: WKWebview how to allow html file located in bundle read access to documents directoryiOS:WKWebview 如何允许位于 bundle 中的 html 文件对文档目录进行读取访问
【发布时间】:2020-01-27 09:54:12
【问题描述】:

我有一个位于捆绑包中的 html 文件,我正在使用 WKWebView 从该 html 加载内容:

let fileURL = URL(fileURLWithPath: Bundle.main.path(forResource:"demo", ofType: "html")!)
    webView.loadFileURL(fileURL, allowingReadAccessTo: fileURL)

然而,这个 html 文件有一些脚本试图访问位于 Documents 目录中的文件(一些视频保存在那里),但得到“无法加载本地资源”。错误。 我在 AVPlayerViewController 的其他地方使用这些文件,所以我知道这些文件存在并且我使用的 url 是正确的。

我试过了:

1. 将文档目录 url 传递给 allowedReadAccessTo 参数 - webview 甚至不加载

2. 将文件目录中的项目复制到 tmp 目录并在脚本中传递这个 (tmp dir) url - 它可以工作,但是这个过程发生的太多了,而且由于内存问题和大文件所花费的时间,我不想复制这么多文件。

3. 将 html 文件及其脚本从包复制到文档目录 - 不相关因为我使用的脚本不时更改,所以要确保用户始终拥有(脚本的)最新版本,每次应用启动时我都必须复制它。

那么,有没有其他方法可以让 html 文件(位于 bundle 中)访问文档文件?

提前致谢,

【问题讨论】:

    标签: ios swift webview wkwebview


    【解决方案1】:

    这涵盖了一个文件,但您应该能够使用以下代码构建一个将相关文件复制到文档目录的函数。

    ///Copy the file from the bundle to the Documents Directory
    guard let bundleURL = Bundle.main.url(forResource:"demo", ofType: "html") else {
         preconditionFailure("Unable to get bundle URL") 
    }
    
    guard let documentsDirectory = let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
         preconditionFailure("Unable to get Documents URL") 
    }
    
    let newURL = documentsDirectory.appendingPathComponent("demo.html")
    
    do {
       try FileManager.default.copyItem(at: bundleURL, to: newUrl)
    } catch {
       print("Error copying bundle: \(error)")
    }
    
    
    ///Setup the WKWebView
    let prefs = WKPreferences()
    prefs.javaScriptEnabled = true
    
    let webConfig = WKWebViewConfiguration()
    webConfig.preferences = prefs
    
    var webViewer = WKWebView(frame: view.frame, configuration: webConfig)
    webViewer.loadFileURL(newURL, allowingReadAccessTo: documentsDirectory)
    

    请记住,Bundle 在您的应用中完全位于不同的目录中。仅仅因为文件可以访问文档目录并不意味着文件中的 HTML 将能够找到您正在引用的引用脚本或其他 HTML 文件。您应该认为捆绑包中的所有内容都是不可变的,并且位置本身只是源源。

    【讨论】:

    • 感谢您的回答,我不会在运行时更改捆绑包中的文件,有时会替换它们,因为它们正在使用新功能等进行更新。我提到此解决方案不相关因为这意味着应用程序将在每次启动时将此文件复制到文档目录中 - 以确保文件已更新。这就是我寻找一种从捆绑目录访问文档文件夹的方法的原因,这样我就不必复制任何文件。
    • 您可以在复制文件之前比较文件的时间戳(或校验和)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多