设备上的WKWebView无法加载缓存的HTML

时间:2017-12-17 02:42:45

标签: ios swift wkwebview

我有一个完全适用于模拟器的WKWebView,但为什么只在设备中运行时出现白色空白屏幕,这是我的代码:

override func loadView() {
    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.preferences.setValue(true, forKey:"allowFileAccessFromFileURLs")
    webView = WKWebView(frame: .zero, configuration: webConfiguration)
    webView.uiDelegate = self
    view = webView
}

override func viewDidLoad() {
    super.viewDidLoad()

    let path2Esferas = Path.localPath.stringByAppendingPathComponent(path: "\(Path.DIR_IMAGES)\(ImagenDescargaTipo.esfera.rawValue)/\(desarrollo.id)/virtualtour.html")
    let url =  URL(fileURLWithPath: path2Esferas) 
    //NSURL.fileURL(withPath: path2Esferas)

    let myRequest = URLRequest(url: url)
    webView.load(myRequest)
}

“path2Esferas”中的HTML位于我之前加载的缓存文件夹中,如果我将let myURL = URL(string: "https://www.apple.com")之类的其他网址设为docs,则它可以在模拟器和设备中正常运行。例如:http://proyectoshm.com/esferas/real_de_mina/realdeminas.html

7 个答案:

答案 0 :(得分:0)

<强> INTRO

我的解决方案是 NOT 解决完整问题。

我把它留在这里暂时可能有助于理解(主要来自我们下面的评论)什么不起作用。

import UIKit
import WebKit

class ViewController: UIViewController {
  var webView:WKWebView?

  override func viewDidLoad() {
    super.viewDidLoad()

    let webConfiguration = WKWebViewConfiguration()
    self.webView = WKWebView(frame: self.view.frame, configuration: webConfiguration)
    // http request with URLRequest.CachePolicy.returnCacheDataElseLoad
    let request = URLRequest(url: URL(string:"http://proyectoshm.com/esferas/real_de_mina/realdeminas.html")!, cachePolicy: URLRequest.CachePolicy.returnCacheDataElseLoad, timeoutInterval: 10)
    self.webView?.load(request)
    self.view.addSubview(self.webView!)
  }
}

我也加入了plist:

App Transport Security Settings > Allow Arbitrary Loads in Web Content > YES App Transport Security Settings > Allow Arbitrary Loads > YES

最终能够在商店中提交您的应用,您将遇到一些麻烦:

  Apple宣布,自1月起,ATS将需要所有应用程序   2017。

https://forums.developer.apple.com/thread/48979

enter image description here

结果是:

enter image description here

答案 1 :(得分:0)

问题是这句话:

frame: .zero

提供一些帧,即使它是虚拟值:

frame: CGRect(x:0, y:0, width:100, height:100)

答案 2 :(得分:0)

如果我从评论和代码中了解(Path.localPath应与您的本地资源相关...),则必须使用本地文件。我记得它应该与你错误的方法相关,将本地资源加载到WkWebView。事实上,自 iOS 9.0 + 以来,如docs所述,您可以使用实例方法loadFileURL(_:allowingReadAccessTo:)

您还应该尝试loadHTMLString

let path2Esferas = Path.localPath.stringByAppendingPathComponent(path: "\(Path.DIR_IMAGES)\(ImagenDescargaTipo.esfera.rawValue)/\(desarrollo.id)/virtualtour.html")
let folderPath = Path.localPath.stringByAppendingPathComponent(path: "\(Path.DIR_IMAGES)\(ImagenDescargaTipo.esfera.rawValue)/\(desarrollo.id)")
let baseUrl = URL(fileURLWithPath: folderPath, isDirectory: true)
do {
     let htmlString = try NSString(contentsOfFile: htmlPath!, encoding: String.Encoding.utf8.rawValue)
     webView.loadHTMLString(htmlString as String, baseURL: baseUrl)
} catch {
  // catch error
}

P.S。请确保在项目 - &gt;中添加了您的本地 html / JavaScript / CSS 文件目标 - &gt;构建阶段 - &gt;复制捆绑资源

无论如何,请记住,只有在下载完成后才能加载本地资源,所以如果您有异步下载,请确保完成它以使用此代码。

答案 3 :(得分:0)

不要通过设置私有API标记WKWebViewConfiguration来攻击allowFileAccessFromFileURLs,而是尝试使用特殊文件网址方法加载文件网址:

self.webView?.loadFileURL(url, allowingReadAccessToURL: url.deletingLastPathComponent)

答案 4 :(得分:0)

您是否尝试过更改行

let myRequest = URLRequest(url: url)

let myRequest = URLRequest(url: url, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 100)

答案 5 :(得分:0)

请检查您的网络连接,如果您是使用html文件的其他网络,则看不到任何内容

答案 6 :(得分:0)

在找到解决方案的一年多之后,我们需要使用 loadFileURL 来访问本地资源,这是我在WKWebView上的工作代码,加上使用loadHTMLString代替了负载。我的WebView BTW中的 vistaweb

感谢您的回答:Load local web files & resources in WKWebView

        do {

            let local = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
            // Loading: Library/Caches/repositorioLocal/esferas/znvUifZhH8mIDr09cX8j/index.html
            let resourceFolder = "repositorioLocal/esferas/znvUifZhH8mIDr09cX8j"
            let fileToLoad = "index.html"

            let urlToFolder = URL(fileURLWithPath: local).appendingPathComponent(resourceFolder)
            let urlToFile =  URL(fileURLWithPath: local).appendingPathComponent(resourceFolder).appendingPathComponent(fileToLoad)
            let fileContent = try String(contentsOf: urlToFile)

            let webConfiguration = WKWebViewConfiguration()
            webConfiguration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")
            webConfiguration.allowsInlineMediaPlayback = true

            vistaweb = WKWebView(frame: self.view.frame, configuration: webConfiguration)
            self.vistaweb.loadFileURL(urlToFolder, allowingReadAccessTo: urlToFolder)
            self.vistaweb.loadHTMLString(fileContent, baseURL: urlToFile)
            self.view.addSubview(vistaweb)

        } catch let error {
            print("Error: \(error.localizedDescription)")
        }