2016-07-18 20 views
4

毎日「通知名なしの通知を受信しました」という理由で約5,000件の報告された問題が発生します。CoreTelephonyクラッシュ理由:通知名なしの通知を受信しました

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; 

なぜこのクラッシュが発生するのですか?
そして、私のコードを変更してこの問題をもう解決しないようにするにはどうすればよいですか?
ご協力いただきまして誠にありがとうございます。

EDIT:

私はネットワークの種類を検出するために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"; 
    } 
} 
+0

あなたのコードでCoreTelephonyをまったく使用していますか、それとも依存関係の中で使用していますか? – JAL

+0

はい。私は 'CTTelephonyNetworkInfo'クラスを使用して、ユーザのセルラーサービスプロバイダの変更に対応しています。私は通知名なしの通知を知らない。 @JAL – Carina

+0

アプリケーションに使用されているCoreTelephonyコードを質問に追加できますか?それなしではデバッグすることは不可能です。 – JAL

答えて

1

これはTestFlightの古いバージョンでthis similar issueに関連している場合、私は疑問に思う:

、彼らが割り当てを解除された後CTTelephonyNetworkInfoクラスのインスタンスは時々通知を得るために、原因となるiOSのバグがあります。インスタンスをインスタンス化、使用、および解放する代わりに、バグを回避するためにインスタンスを保持し、解放しないでください。

これは、バックトレースの外観からのゾンビのようなにおいがします。リンクされた質問に示唆されているように決して解放されないCTTelephonyNetworkInfoの静的インスタンスを使用してみませんか?

@import CoreTelephony; 

// ... 

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

ありがとうございます。それがゾンビによって引き起こされた場合、例外理由は「SIGSEGV」(または「EXC_BAD_ACCESS」)であり、「通知名なしの通知を受け取りました」という理由でNSExceptionではありません。 – Carina

+0

@Carinaああ、それは本当に良い点です。さて、私はさらに調査します。 – JAL

0

この問題を解決するには、私はもともと-[CTTelephonyNetworkInfo handleNotificationFromConnection:ofType:withInfo:]に送られたすべてのコールを再ルーティングするための方法のスウィズリングを使用します。
正常に動作します。

#import <CoreTelephony/CTTelephonyNetworkInfo.h> 

struct __CTServerConnection { 
    int a; 
    int b; 
    CFMachPortRef myport; 
    int c; 
    int d; 
    int e; 
    int f; 
    int g; 
    int h; 
    int i; 
}; 

typedef struct __CTServerConnection CTServerConnection; 
typedef CTServerConnection* CTServerConnectionRef; 


@implementation CTTelephonyNetworkInfo (Fixed) 

- (void)fixed_handleNotificationFromConnection:(CTServerConnectionRef)connection 
             ofType:(NSString *)notificationName 
             withInfo:(NSDictionary *)info 
{ 
    if ([notificationName length]) { 
     return [self fixed_handleNotificationFromConnection:connection 
                ofType:notificationName 
                withInfo:info]; 
    } 
} 
+0

こんにちはカリナ、私はあなたのすばらしい提案とinteresstedです。しかし、私はこれを機能させることに成功しなかった。私が理解しているように、handleNotificationFromConnectionはプライベートAPIであり、iOS 8.3以降は呼び出すことができません。どのようにしてこれを機能させましたか?どうもありがとう – SlumTheSlug

関連する問題