Swift WKWebView加载本地文件无法在设备上运行

时间:2015-01-06 16:51:19

标签: ios objective-c swift web-applications webview

我在尝试在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!)
}

非常感谢任何帮助

亲切的问候, 迪米塔尔

5 个答案:

答案 0 :(得分:6)

感谢任何试图回答我问题的人。我已经发布这是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)

亲切的问候, 迪米塔尔

答案 1 :(得分:2)

在启动iOS 9的loadFileURL上有一个函数WKWebView,显然必须在从文件URL读取数据时使用。

使用带有URLRequest的load函数,文件网址确实在模拟器中工作,但在设备上无效 - 网页视图在设备上保持空白。使用loadFileURL可在设备和模拟器上运行。

不幸的是,使用loadHTMLString引入了另一个问题(在同一网页视图中跳转到另一个位置的本地锚点不再起作用),并且可能应该避免,直到Apple发布针对该问题的修复程序。

答案 2 :(得分:1)

只需执行以下操作:

if url.isFileURL {
    webView.loadFileURL(url, allowingReadAccessTo: url)
} else {
    let request = URLRequest(url: url)
    webView.load(request)
}

答案 3 :(得分:1)

实际上,问题是由webView.load()函数引起的,如果我们在模拟器上对其进行测试,它将可以正常工作,但是对于实际设备,它可能会引起一些问题,并且无法完美加载Webview。您可以通过调用didFinish()函数进行检查。 您需要执行的是呼叫webView.loadFileURL()而不是webView.load()。它可以在模拟器和真实设备中使用。当您从本地文件目录加载任何文件时,这非常有用。

答案 4 :(得分:0)

另见WKWebView not loading local files under iOS 8关于其他解决方法的讨论,以及iOS 9的好消息