WKWebView崩溃记录——SIGSEGV(11)

关键词:
WKWebView
SIGSEGV(11)
WebKit::LegacyCustomProtocolManagerProxy::stopLoading(unsigned long long)
WKProcessPool

在QA测试疯狂把玩App时,突然出现了crash问题,而且还是一个概率非常小的偶发crash。吓得我立马跑到bugly上查看crash记录。在通过符号表转换后,我得到了以下crash时的堆栈信息。

0 WebKit    WebKit::LegacyCustomProtocolManagerProxy::stopLoading(unsigned long long) + 20
1 CFNetwork ___65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke + 60
2 CFNetwork -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:] + 196
3 CFNetwork -[NSURLConnectionInternal _withActiveConnectionAndDelegate:] + 56
4 CFNetwork ___ZN27URLConnectionClient_Classic26_delegate_didFinishLoadingEU13block_pointerFvvE_block_invoke + 100
5 CFNetwork ___ZN27URLConnectionClient_Classic18_withDelegateAsyncEPKcU13block_pointerFvP16_CFURLConnectionPK33CFURLConnectionClientCurrent_VMaxE_block_invoke_2 + 108
6 libdispatch.dylib __dispatch_client_callout + 16
7 libdispatch.dylib __dispatch_block_invoke_direct$VARIANT$armv81 + 216
8 CFNetwork RunloopBlockContext::_invoke_block(void const*, void*) + 36
9 CoreFoundation    CFArrayApplyFunction + 80
10 CFNetwork    RunloopBlockContext::perform() + 128
11 CFNetwork    MultiplexerSource::perform() + 312
12 CFNetwork    MultiplexerSource::_perform(void*) + 60
13 CoreFoundation   ___CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
14 CoreFoundation   ___CFRunLoopDoSource0 + 88
15 CoreFoundation   ___CFRunLoopDoSources0 + 176
16 CoreFoundation   ___CFRunLoopRun + 1004
17 CoreFoundation   CFRunLoopRunSpecific + 436
18 GraphicsServices GSEventRunModal + 104
19 UIKitCore    UIApplicationMain + 212
20 gymbo    0x0000000104f50000 + 717816
21 libdyld.dylib    _start + 4

触发场景:
加载WKWebView的ViewController被释放,但WKWebView内容还在加载中,即使在VC的 dealloc(swift版本的是 deinit 方法)中设置webView stoploading以及WKWebView UIDelegate和navigationDelegate设置为nil,也会偶发该崩溃。

解决方案:
WKWebView中的WKProcessPool类,设置成单例
代码:swift版
声明WKProcessPool为单例

// MARK: - 扩展WKProcessPool,使其变成单例,所有WKWebView共享Cookie数据
extension WKProcessPool {
  static var SharedProcessPool: WKProcessPool = {
    var sharePool = WKProcessPool()
    return sharePool
  }()
  
  class func sharedProcessPool() -> WKProcessPool {
    return SharedProcessPool
  }
}

在WKWebView初始化时,配置processPool

      let configuration = WKWebViewConfiguration()
      configuration.processPool = WKProcessPool.sharedProcessPool()
      let webView = WKWebView(frame: UIScreen.main.bounds, configuration: configuration)

后面会说明查找分析问题过程以及其中原理


bugly符号表解析后的出错堆栈截图
bugly自定义跟踪日志截图

方案有效的原因:
WKProcessPool类的作用,以及崩溃触发的根本原因,还在研究中~后续会补充


该文章首次发表在 简书:我只不过是出来写写代码 博客,并自动同步至 腾讯云:我只不过是出来写写iOS 博客

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit...
    Jecky丶阅读 8,646评论 2 22
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 转载链接:腾讯Bugly 导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView ...
    Jelly_沫阅读 2,872评论 0 3
  • 1. 作用 创建一个独立的python开发环境,用于解决版本和包的依赖问题 2. 安装 debian下安装 使用p...
    fada492daf5b阅读 2,261评论 0 0
  • 2.1 主存储器 主存储器是计算机系统中的一个主要部件,用于保存进程运行时的程序和数据,CPU的控制部件只能从主存...
    溪的风阅读 1,357评论 0 0