ios - CoreTelephony 因 : Received a notification with no notification name 原因崩溃

标签 ios iphone crash reachability core-telephony

我每天都会收到大约 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";
    }
}

最佳答案

我想知道这是否与 this similar issue 有关使用旧版本的 TestFlight:

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];
    });
}

关于ios - CoreTelephony 因 : Received a notification with no notification name 原因崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38434686/

相关文章:

ios - 新的应用内购买不会显示在 iTunes 应用程序产品页面中

iphone - 是否可以在静态库中使用 StoreKit(应用内购买)?

javascript - 我如何修复 :hover on iPhone if there is no <a> element?

python - pygame事件队列功能在鼠标输入时崩溃

ios - dequeueReusableCellWithIdentifier 返回相同索引路径的不同单元格

c++ - 带有 gzstream 库的 rapidjson 最后一个字符 '-1'

iphone - 应用内购买,因为处理时间长取消购买

iphone - Unix下针对iphone开发

ipad - UITableView 崩溃没有错误

ios - 应用程序在第一次 AppStore 下载时挂起,然后总是在启动时崩溃 (iOS 9)