wkwebview ios 10在重新创建webview后停止使用localfileurl加载文件
Posted
技术标签:
【中文标题】wkwebview ios 10在重新创建webview后停止使用localfileurl加载文件【英文标题】:wkwebview ios 10 stops loading files with localfileurl after recreation of webview 【发布时间】:2017-06-26 22:48:24 【问题描述】:我对 wkwebview 和 ios 10.3 和 swift 3 有一个奇怪的行为。
我正在使用 wkwebview 来显示本地 html 文件(在应用程序支持下)。 首次启动时一切正常,本地网站(包括 js 和 css)运行良好。但是,如果我从 Internet 获取内容更新(这涉及删除 html 目录和提取新文件),webview 将不会加载文件。如果我只是尝试重用现有的 webview:
self.webView?.loadFileURL(URL(fileURLWithPath: ( sharedConfig.WEBROOT + self.getIndexPage(requestProps.landingPage))), allowingReadAccessTo: sharedConfig.BASEURL)
甚至使用 javascript 调用 window.location.href='\(self.landingPage)'
我在调试控制台中收到相当奇怪的错误消息:
尺寸:(0 0) 和格式:(0) 的表面创建失败
如果我尝试使用以下命令重新初始化 wkwebview:
` ...
DispatchQueue.main.async
for subview in self.view.subviews
if subview is WKWebView
subview.removeFromSuperview()
let contentController = WKUserContentController();
contentController.add(
self,
name: "callbackHandler"
)
let processPool: WKProcessPool = WKProcessPool.init()
let config = WKWebViewConfiguration()
config.processPool = processPool
config.userContentController = contentController
...
self.webView = WKWebView(
frame: CGRect.zero,
configuration: config
)
self.webView!.uiDelegate = self
self.webView!.navigationDelegate = self
self.webView!.translatesAutoresizingMaskIntoConstraints = false
self.webView!.allowsBackForwardNavigationGestures = true
let localfilePath = sharedConfig.WEBROOT + absPath
let localFileUrl = URL(fileURLWithPath: localfilePath)
self.webView?.tag = 12
self.view.addSubview(self.webView!)
let height = NSLayoutConstraint(item: self.webView!, attribute: .height, relatedBy: .equal, toItem: self.view, attribute: .height, multiplier: 1, constant: 0)
let width = NSLayoutConstraint(item: self.webView!, attribute: .width, relatedBy: .equal, toItem: self.view, attribute: .width, multiplier: 1, constant: 0)
self.view.addConstraints([height, width])
_ = self.webView?.loadFileURL(localFileUrl, allowingReadAccessTo: sharedConfig.BASEURL)
什么都没有发生 - 显示的 html 没有变化,没有错误,没有冻结 - 本地网站照常工作(涉及 loadFileURL 调用的函数除外 - 但此代码在 ios 9.3 中有效,我确信它在 ios 10 中有效.
我还知道 ios 10.3 beta 中存在 wkwebview 问题和带有空格的文件路径的错误 - 但我也使用 Documents 目录对此进行了测试,结果相同。
但过了一会儿我得到了这个日志输出:
无法向服务 com.apple.WebKit.Networking 发出信号:113:找不到指定的服务
这个答案here 表明,它可能与未将 web 视图正确添加为子视图有关。但是我看不到我在将 webview 添加到子视图时是否做错了......
更新
视图层次结构的进一步调试结果是“wkwebview 的位置不明确”。
po [[UIWindow keyWindow] _autolayoutTrace]
结果如下:
•UIWindow:0x7fbce4b06380 - AMBIGUOUS LAYOUT
| UITransitionView:0x7fbce2424cc0
| | •UIView:0x7fbce2611430
| | | *_UILayoutGuide:0x7fbce2612150
| | | *_UILayoutGuide:0x7fbce260cf10
| | | *WKWebView:0x7fbce508b000'Appname'- AMBIGUOUS LAYOUT for WKWebView:0x7fbce508b000'Appname'.minXid: 72, WKWebView:0x7fbce508b000'Appname'.minYid: 73
| | | | WKScrollView:0x7fbce508b600
| | | | | WKContentView:0x7fbce5086000
| | | | | | UIView:0x7fbce25194c0
| | | | | | | UIView:0x7fbce25136e0
| | | | | | | | WKCompositingView:0x7fbce261f4f0
| | | | | | | | | WKCompositingView:0x7fbce26201c0
| | | | | | | | | | WKCompositingView:0x7fbce2620020
| | | | | | | | | | | WKCompositingView:0x7fbce261fce0
| | | | | | | | | | | | WKCompositingView:0x7fbce2620500
| | | | | | | | | | | WKCompositingView:0x7fbce261fe80
| | | | | | | | | | | | WKCompositingView:0x7fbce251a4d0
| | | | | | | | | | | | | WKCompositingView:0x7fbce251a330
| | | | | | | | | | | | | | WKCompositingView:0x7fbce2522790
| | | | | | | | | | | | | | | UIScrollView:0x7fbce4069000
| | | | | | | | | | | | | | | | WKCompositingView:0x7fbce251e230
| | | | | | | | | | WKCompositingView:0x7fbce261e280
| | | | | | | | | WKCompositingView:0x7fbce2620360
| | | | | UIView:0x7fbce2509060
| | | | | UIImageView:0x7fbce4b1fb00
| | | | | UIImageView:0x7fbce4b1f910
Legend:
* - is laid out with auto layout
+ - is laid out manually, but is represented in the layout engine because translatesAutoresizingMaskIntoConstraints = YES
• - layout engine host
但现在我还有更多问题:
这种奇怪的 WKWebView 行为可能是“不明确的布局”造成的吗? 如果是这样,我该如何解决这种歧义?更新 2:
感谢this answer,我可以解决不明确的布局,并且视图层次结构调试器很高兴 - 但不幸的是,这并没有解决 webview 的问题 - 它仍然没有响应 loadFileURL 请求!
【问题讨论】:
【参考方案1】:好的,我终于找到了解决办法:
我不小心创建了一个新的 ViewController 对象而不是使用当前实例,并且我的代码在新的 ViewController 上初始化了另一个 webview。
所以我以某种方式丢失了对旧的可见 webview 的引用,因此它不再响应。
使用正确的实例后一切正常。但是我仍然想知道为什么这没有导致指向此的其他一些错误。
【讨论】:
以上是关于wkwebview ios 10在重新创建webview后停止使用localfileurl加载文件的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 10 + Swift 3 中以编程方式在我的 WKWebView 上方添加 UILabel
如何在 iOS 10 上覆盖 WKWebView 的“保存图像”菜单