CoreTelephony 崩溃(无法重现)

5

这个崩溃只发生在生产环境中。

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

this one too

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

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


你确定用户的设备中实际插入了SIM卡吗?如果你在应用程序中有一个按钮为用户提供电话呼叫操作,而他没有插入或激活SIM卡,你的应用程序可能会崩溃。 - ares777
感谢您的评论,我们的应用程序没有任何呼叫功能。它是一个普通的电子商务应用程序。 - tzl
1个回答

2

当CTTelephonyNetworkInfo在释放后接收通知时,会出现此错误。相反,您应该使用:

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

因为,正如其他人所说:

"有一个iOS bug会导致CTTelephonyNetworkInfo类的实例在被释放后仍然收到通知。为了解决这个问题,您必须保留实例并永不释放,而不是实例化、使用和释放实例。"

更多信息在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接