【发布时间】:2017-01-17 16:02:17
【问题描述】:
我在我的 UIViewController 中实现了一个 WKWebViewDelegate,因为由于 Apple 设计指南,这个 WKWebView 背后的网站需要摄像头权限并且必须在应用程序内打开。
在我的测试环境中,一切正常。我使用 crashyltics 在实时环境中分析我的应用程序。我的 10-15% 的用户(100% = 130 每日用户)会遇到以下问题。
Crashed: com.apple.main-thread
0 CoreFoundation 0x182691968 CFRunLoopAddTimer + 88
1 JavaScriptCore 0x186f6cf98 WTF::RunLoop::TimerBase::start(double, bool) + 188
2 **WebKit** 0x18bb8362c IPC::ConnectionTerminationWatchdog::ConnectionTerminationWatchdog(WTF::OSObjectPtr<NSObject<OS_xpc_object>*>&, double) + 164
3 **WebKit** 0x18bb826d0 IPC::ConnectionTerminationWatchdog::createConnectionTerminationWatchdog(WTF::OSObjectPtr<NSObject<OS_xpc_object>*>&, double) + 48
4 WebKit 0x18bb7c488 WebKit::ChildProcessProxy::shutDownProcess() + 76
5 WebKit 0x18bd35cd0 WebKit::WebProcessProxy::shutDown() + 36
6 WebKit 0x18bd36244 WebKit::WebProcessProxy::removeWebPage(unsigned long long) + 432
7 WebKit 0x18bcd0934 WebKit::WebPageProxy::close() + 536
8 WebKit 0x18bdc3200 -[WKWebView dealloc] + 112
9 libobjc.A.dylib 0x1811f5fe0 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 704
10 UIKit 0x188658668 -[UIView dealloc] + 1644
11 libobjc.A.dylib 0x1811f5fe0 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 704
12 UIKit 0x188658668 -[UIView dealloc] + 1644
....
另一个错误是
Crashed: com.apple.main-thread
0 libdispatch.dylib 0x190daaf20 _dispatch_barrier_sync_f_slow + 596
1 WebKit 0x19b37701c __64-[WKProcessAssertionBackgroundTaskManager _updateBackgroundTask]_block_invoke + 240
2 WebKit 0x19b37701c __64-[WKProcessAssertionBackgroundTaskManager _updateBackgroundTask]_block_invoke + 240
因此,我阅读了很多关于 EXC_BAD_ACCESS 的内容,并且我了解到指向一个对象的引用是 nil。
我的 WKWebView 长什么样子
这是我的故事板中的结构:
我需要使用 ContainerView,因为我的代码只能使用 self.view = self.webView 行尝试只拍摄一个视图,但 WKWebView 没有初始化。
//WKWebView in Container
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
webView = WKWebView()
self.webView.navigationDelegate = self
self.view = self.webView
dispatch_async(dispatch_get_main_queue()) {
if self.url.characters.count > 0 {
if let url = NSURL(string: self.url) {
self.webView.loadRequest(NSURLRequest(URL: url))
self.webView.allowsBackForwardNavigationGestures = true
}
}
}
}
最后但并非最不重要的一点是,当我调用 WKWebView(或带有包含 WKWebView 的 ContainerView 的 ViewController)时,我发现
viewController.presentViewController(vc, animated: true, completion: nil)
并用
关闭super.dismissViewControllerAnimated(flag, completion: completion)
内存不会释放。所以我可以(当我调用 WKWebView 超过 100 次时)会发生内存泄漏。在现场环境中,这种情况确实不太可能发生。
但是.. 问题是我无法重现我的用户遇到的这个错误。所以在我将下一个版本发送到 App Store 之前给你的问题是:你在我的代码中看到没有通过吗?可能引发此错误的东西?
我将部分代码更改为:
- 取消注释 dispatch_async 或使用
// dispatch_async(dispatch_get_main_queue()) { [weak self] () -> Void in - 将 webView 设置为可选
var webView:WKWebView?
【问题讨论】:
-
有什么好办法解决这个问题吗?
标签: ios swift webkit exc-bad-access