ios – CoreTelephony因原因崩溃:收到没有通知名称的通知

我每天收到大约5,000个报告的问题,原因是“收到了没有通知名称的通知”.

Application Specific Information:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException'  reason: 'Received a notification with no notification name'

Last Exception Backtrace:
0   CoreFoundation                      0x000000018206e950 __exceptionPreprocess + 132
1   libobjc.A.dylib                     0x000000018e5741fc objc_exception_throw + 60
2   CoreFoundation                      0x000000018206e810 +[NSException raise:format:arguments:] + 116
3   Foundation                          0x0000000182ba6db4 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 112
4   CoreTelephony                       0x00000001827ca39c -[CTTelephonyNetworkInfo handleNotificationFromConnection:ofType:withInfo:] + 272
5   CoreTelephony                       0x00000001827c9784 _ServerConnectionCallback(__CTServerConnection*, __CFString const*, __CFDictionary const*, void*) + 152
6   CoreTelephony                       0x00000001827de958 ___ZNK13CTServerState21sendNotification_syncE7CTEventPK10__CFStringPK14__CFDictionary_block_invoke15 + 32
7   libdispatch.dylib                   0x000000018eb4c014 _dispatch_call_block_and_release + 24
8   libdispatch.dylib                   0x000000018eb4bfd4 _dispatch_client_callout + 16
9   libdispatch.dylib                   0x000000018eb524a8 _dispatch_queue_drain + 640
10  libdispatch.dylib                   0x000000018eb4e4c0 _dispatch_queue_invoke + 68
11  libdispatch.dylib                   0x000000018eb530f4 _dispatch_root_queue_drain + 104
12  libdispatch.dylib                   0x000000018eb534fc _dispatch_worker_thread2 + 76
13  libsystem_pthread.dylib             0x000000018ece16bc _pthread_wqthread + 356
14  libsystem_pthread.dylib             0x000000018ece154c start_wqthread + 4

我发现所有CoreTelephony通知并尝试重现该问题但失败了.

    /* For use with the CoreTelephony notification system. */
    extern CFStringRef kCTRegistrationStatusChangedNotification;
    extern CFStringRef kCTRegistrationStateDurationReportNotification;
    extern CFStringRef kCTRegistrationServiceProviderNameChangedNotification;
    extern CFStringRef kCTRegistrationOperatorNameChangedNotification;
    extern CFStringRef kCTRegistrationNewServingNetworkNotification;
    extern CFStringRef kCTRegistrationDataStatusChangedNotification;
    extern CFStringRef kCTRegistrationDataActivateFailedNotification;
    extern CFStringRef kCTRegistrationCellularDataPlanHideIndicatorNotification;
    extern CFStringRef kCTRegistrationCellularDataPlanActivateFailedNotification;
    extern CFStringRef kCTRegistrationCustomerServiceProfileUpdateNotification;
    extern CFStringRef kCTRegistrationCellChangedNotification;
    extern CFStringRef kCTRegistrationCauseCodeNotification;

为什么我会这次崩溃?
我怎样才能更改我的代码,以便我不再遇到这个问题?
任何帮助都非常感谢.

编辑:

我正在使用Reachability类(https://github.com/tonymillion/Reachability)来检测网络类型.

+ (NSString *)networkName
 {    
    Reachability *reach = [Reachability reachabilityForInternetConnection];
    [reach startNotifier];

    NetworkStatus networkStatus = [reach currentReachabilityStatus];
    CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init];

    if (networkStatus == ReachableViaWiFi) {
        return @"WIFI";
    } else if (networkStatus == ReachableViaWWAN) {
        if ([telephonyInfo respondsToSelector:@selector(currentRadioAccessTechnology)]) { 
            if ([[telephonyInfo currentRadioAccessTechnology] isEqualToString:CTRadioAccessTechnologyGPRS]) {
                return @"GPRS";
            } else if ([[telephonyInfo currentRadioAccessTechnology]  isEqualToString:CTRadioAccessTechnologyEdge]) {
                return @"EDGE";
            } else if ([[telephonyInfo currentRadioAccessTechnology]  isEqualToString:CTRadioAccessTechnologyWCDMA]) {
                return @"WCDMA";
            } else if ([[telephonyInfo currentRadioAccessTechnology]  isEqualToString:CTRadioAccessTechnologyHSDPA]) {
                return @"HSDPA";
            } else if ([[telephonyInfo currentRadioAccessTechnology]  isEqualToString:CTRadioAccessTechnologyHSUPA]) {
                return @"HSUPA";
            } else if ([[telephonyInfo currentRadioAccessTechnology]  isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
                return @"CDMA1X";
            } else if ([[telephonyInfo currentRadioAccessTechnology]  isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) {
                return @"CDMAEVDOREV0";
            } else if ([[telephonyInfo currentRadioAccessTechnology]  isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) {
                return @"CDMAEVDOREVA";
            } else if ([[telephonyInfo currentRadioAccessTechnology]  isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) {
                return @"CDMAEVDOREVB";
            } else if ([[telephonyInfo currentRadioAccessTechnology]  isEqualToString:CTRadioAccessTechnologyeHRPD]) {
                return @"HRPD";
            } else if ([[telephonyInfo currentRadioAccessTechnology]  isEqualToString:CTRadioAccessTechnologyLTE]) {
                return @"LTE";
            }
            return @"UNKNOWN";
        } else {
            return @"WWAN";
        }
    } else {
        return @"NotReachable";
    }
}

最佳答案 我想知道这是否与旧版TestFlight的
this similar issue有关:

There is an iOS bug that causes instances of the CTTelephonyNetworkInfo class to sometimes get notifications after they have been deallocated. Instead of instantiating, using, and releasing instances you must instead retain and never release them to work around the bug.

从你的回溯看起来就像一个僵尸.为什么不尝试使用CTTelephonyNetworkInfo的静态实例,这个实例从未按链接问题的建议发布?

@import CoreTelephony;

// ...

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