CoreTelephony 崩溃(不可重现)

tzl*_*tzl 5 ios core-telephony

这种崩溃只发生在生产中

Crashed Thread
0   
libobjc.A.dylib 0x000000019843fbd0 objc_msgSend + 16
1   
CoreTelephony 0x00000001886bac5c _ZL25_ServerConnectionCallbackP20__CTServerConnectionPK10__CFStringPK14__CFDictionaryPv + 48
2   
CoreTelephony 0x00000001886d1030 ___ZNK13CTServerState21sendNotification_syncE7CTEventPK10__CFStringPK14__CFDictionary_block_invoke14 + 28
3   
libdispatch.dylib 0x0000000198a713ac _dispatch_call_block_and_release + 20
4   
libdispatch.dylib 0x0000000198a7136c _dispatch_client_callout + 12
5   
libdispatch.dylib 0x0000000198a7b4c0 _dispatch_queue_drain + 1212
6   
libdispatch.dylib 0x0000000198a74474 _dispatch_queue_invoke + 128
7   
libdispatch.dylib 0x0000000198a7d224 _dispatch_root_queue_drain + 660
8   
libdispatch.dylib 0x0000000198a7e75c _dispatch_worker_thread3 + 104
9   
libsystem_pthread.dylib 0x0000000198c4d2e4 _pthread_wqthread + 812
10  
libsystem_pthread.dylib 0x0000000198c4cfa8 start_wqthread + 0
Run Code Online (Sandbox Code Playgroud)

这个也是

Crashed Thread
0   
libobjc.A.dylib 0x306e1f46 objc_msgSend + 6
1   
CoreTelephony 0x2291fc95 ___ZNK13CTServerState21sendNotification_syncE7CTEventPK10__CFStringPK14__CFDictionary_block_invoke14 + 14
2   
libdispatch.dylib 0x30c662e3 _dispatch_call_block_and_release + 8
3   
libdispatch.dylib 0x30c6e729 _dispatch_queue_drain + 1466
4   
libdispatch.dylib 0x30c68aad _dispatch_queue_invoke + 82
5   
libdispatch.dylib 0x30c6ff9f _dispatch_root_queue_drain + 392
6   
libdispatch.dylib 0x30c713c3 _dispatch_worker_thread3 + 92
7   
libsystem_pthread.dylib 0x30dcddc1 _pthread_wqthread + 666
8   
libsystem_pthread.dylib 0x30dcdb14 start_wqthread + 6
Run Code Online (Sandbox Code Playgroud)

我从日志中猜测这些只会在设备休眠后的一段时间内发生。因为崩溃和上次活动日志之间的时间戳至少相隔 10 分钟。我们自己不使用 coretelephony,但是我们使用的一些框架确实将 coretelephony 作为依赖项。任何人都知道如何复制这个,或者知道如何解决这个问题?

use*_*236 2

当 CTTelephonyNetworkInfo 发布后收到通知时会出现此错误。相反,你应该使用:

   static CTTelephonyNetworkInfo *netInfo; 
   static dispatch_once_t dispatchToken; 
   if (!netInfo) { 
      dispatch_once(&dispatchToken, ^{ 
         netInfo = [[CTTelephonyNetworkInfo alloc] init]; 
      }); 
   }
Run Code Online (Sandbox Code Playgroud)

因为,正如其他人所说:

存在一个 iOS 错误,导致 CTTelephonyNetworkInfo 类的实例有时会在释放后收到通知。您必须保留并且永远不释放实例,而不是实例化、使用和释放实例,以解决该错误。

更多信息请点击这里