Swift WKWebView 加载本地文件无法在设备上运行
Swift WKWebView Loading local file not working on a device
我尝试在 iPad(或任何设备)上运行我的应用程序时遇到一些问题,它在模拟器上按预期运行,所以它在设备上无法运行很奇怪。我想知道是否有人可以指出我正确的方向。我花了很多时间阅读这里关于相同问题的所有其他帖子,但是建议的解决方案均无效。
我有一个 WKWebView,我正在向其中加载本地 html 文件。在模拟器上,文件加载并且一切正常,但在设备上,我在日志中收到一条消息:
无法为“/”创建沙盒扩展
这是我将文件加载到
中的代码
override func viewDidLoad() {
super.viewDidLoad()
var path = NSBundle.mainBundle().pathForResource("Login_UK",
ofType: "html")
var url = NSURL(fileURLWithPath: path!)
var request = NSURLRequest(URL: url!)
var theConfiguration = WKWebViewConfiguration()
theConfiguration.userContentController.addScriptMessageHandler(self,
name: "callbackHandler")
webView = WKWebView(frame: self.view.frame,
configuration: theConfiguration)
webView!.loadRequest(request)
self.view.addSubview(webView!)
}
任何帮助将不胜感激
亲切的问候,
迪米塔尔
感谢任何试图回答我问题的人。我已经发布了这是 Apple 试图修复的 WebKit 库的错误。但是,我发现了一个很好的解决方法,几乎不需要做任何工作。
我打开本地文件并读取其内容,然后将该字符串发送到 webView.loadHTMLString 方法,该方法编译文件中的 hmtl。这样就可以避免 iOS 无法找到本地文件路径的问题。
这是一个读取文件然后打开文件的示例,供遇到相同问题的任何人使用:
let path2 = NSBundle.mainBundle().pathForResource("index", ofType: "html")
var text = String(contentsOfFile: path2!, encoding: NSUTF8StringEncoding, error: nil)!
webView!.loadHTMLString(text, baseURL: url)
亲切的问候,
迪米塔尔
在 WKWebView
上有一个函数 loadFileURL
从 iOS 9 开始显然必须在从文件 URL 读取数据时使用。
使用 load
函数和 URL 文件请求 URL 很奇怪 在模拟器中工作,但在设备 - Web 视图在设备上保持空白。使用 loadFileURL
适用于设备和模拟器。
不幸的是,使用 loadHTMLString
会引入另一个问题(在同一 Web 视图中跳转到另一个位置的本地锚不再起作用),在 Apple 发布该问题的修复程序之前可能应该避免使用。
只需这样做:
if url.isFileURL {
webView.loadFileURL(url, allowingReadAccessTo: url)
} else {
let request = URLRequest(url: url)
webView.load(request)
}
实际上问题出在webView.load()
函数上,如果我们在模拟器上测试它会完美运行,但对于真实设备它可能会导致一些问题并且无法完美加载webview。您可以通过调用 didFinish()
函数来检查它。
您需要做的是调用 webView.loadFileURL()
而不是 webView.load()
。它适用于模拟器和真实设备。当您从本地文件目录加载任何文件时,这非常有用。
我尝试在 iPad(或任何设备)上运行我的应用程序时遇到一些问题,它在模拟器上按预期运行,所以它在设备上无法运行很奇怪。我想知道是否有人可以指出我正确的方向。我花了很多时间阅读这里关于相同问题的所有其他帖子,但是建议的解决方案均无效。
我有一个 WKWebView,我正在向其中加载本地 html 文件。在模拟器上,文件加载并且一切正常,但在设备上,我在日志中收到一条消息:
无法为“/”创建沙盒扩展
这是我将文件加载到
中的代码override func viewDidLoad() {
super.viewDidLoad()
var path = NSBundle.mainBundle().pathForResource("Login_UK",
ofType: "html")
var url = NSURL(fileURLWithPath: path!)
var request = NSURLRequest(URL: url!)
var theConfiguration = WKWebViewConfiguration()
theConfiguration.userContentController.addScriptMessageHandler(self,
name: "callbackHandler")
webView = WKWebView(frame: self.view.frame,
configuration: theConfiguration)
webView!.loadRequest(request)
self.view.addSubview(webView!)
}
任何帮助将不胜感激
亲切的问候, 迪米塔尔
感谢任何试图回答我问题的人。我已经发布了这是 Apple 试图修复的 WebKit 库的错误。但是,我发现了一个很好的解决方法,几乎不需要做任何工作。
我打开本地文件并读取其内容,然后将该字符串发送到 webView.loadHTMLString 方法,该方法编译文件中的 hmtl。这样就可以避免 iOS 无法找到本地文件路径的问题。
这是一个读取文件然后打开文件的示例,供遇到相同问题的任何人使用:
let path2 = NSBundle.mainBundle().pathForResource("index", ofType: "html")
var text = String(contentsOfFile: path2!, encoding: NSUTF8StringEncoding, error: nil)!
webView!.loadHTMLString(text, baseURL: url)
亲切的问候, 迪米塔尔
在 WKWebView
上有一个函数 loadFileURL
从 iOS 9 开始显然必须在从文件 URL 读取数据时使用。
使用 load
函数和 URL 文件请求 URL 很奇怪 在模拟器中工作,但在设备 - Web 视图在设备上保持空白。使用 loadFileURL
适用于设备和模拟器。
不幸的是,使用 loadHTMLString
会引入另一个问题(在同一 Web 视图中跳转到另一个位置的本地锚不再起作用),在 Apple 发布该问题的修复程序之前可能应该避免使用。
只需这样做:
if url.isFileURL {
webView.loadFileURL(url, allowingReadAccessTo: url)
} else {
let request = URLRequest(url: url)
webView.load(request)
}
实际上问题出在webView.load()
函数上,如果我们在模拟器上测试它会完美运行,但对于真实设备它可能会导致一些问题并且无法完美加载webview。您可以通过调用 didFinish()
函数来检查它。
您需要做的是调用 webView.loadFileURL()
而不是 webView.load()
。它适用于模拟器和真实设备。当您从本地文件目录加载任何文件时,这非常有用。