我有一个完全适用于模拟器的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
答案 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
结果是:
答案 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)")
}