ios - WKWebView 中的 EXC_BAD_ACCESS 和/或 EXC_BREAKPOINT - 可能的更改以快速修复

标签 ios swift webkit exc-bad-access

我在我的 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 是什么样的

这是我 Storyboard中的结构:

我需要使用 ContainerView,因为我的代码只使用行 self.view = self.webView 试图只获取一个 View ,但 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 之前要问你的问题是:你看到我的代码中有一个不可行的地方吗?可能引发此错误的东西?

我将部分代码更改为:

  1. 取消注释 dispatch_async 或使用 //dispatch_async(dispatch_get_main_queue()) { [weak self] () -> Void in
  2. 将 webView 设置为可选 var webView:WKWebView?

最佳答案

非常困惑。我的程序是:用户点击 Button 到 WKWebview。我请求相机许可。用户给或不给。用户返回。应用关闭。

当我不请求相机许可时,就不会再有任何中断。更多我无法找到。

关于ios - WKWebView 中的 EXC_BAD_ACCESS 和/或 EXC_BREAKPOINT - 可能的更改以快速修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41701738/

相关文章:

ios - 用 3 个图像构建一个 UIButton

ios - 在 UICollectionView Swift 3 的单独 View Controller 中查看图像

ios - 在ios上创建Firebase用户而不自动登录

ios - 检查是否在核心数据中设置了属性?

html - DOM 元素存在但不可见,直到更改某些 CSS 属性

iphone - @font-face 在 iPhone 版本的 Safari 上已弃用。我有什么选择?

ios - 图像未设置为 UIImageView 的嵌套 UIViewController

ios - 有什么办法知道是否通过 Apple Music 下载了歌曲?

swift - 仅在 Swift 中一次随机播放 TableView 数组

html - webkit 框圆 Angular 有困难