2014-09-05 99 views
3

我有一個奇怪的問題,我無法自行復制。我的一些用戶正在爲Apple推送通知返回空白(或空)設備令牌。它可能發生在5%的用戶身上。 任何人都有同樣的問題或知道這件事。設備令牌NULL

我爲獲得設備令牌代碼是:

- (void)application: (UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken: (NSData*)deviceToken 
{ 
    NSLog(@"My token is: %@", deviceToken); 
    NSString* tokenString = [[[[deviceToken description] 
          stringByReplacingOccurrencesOfString: @"<" withString: @""] 
          stringByReplacingOccurrencesOfString: @">" withString: @""] 
          stringByReplacingOccurrencesOfString: @" " withString: @""] ; 

    NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
    [def setObject:tokenString forKey:@"deviceToken"]; 

} 

- (void)application: (UIApplication*)application didFailToRegisterForRemoteNotificationsWithError: (NSError*)error 
{ 
    NSLog(@"Failed to get token, error: %@", error) ; 
} 

回答

3

你不應該操縱設備令牌以這種方式,特別是不使用description方法,這是一種調試輔助,而不是一個型轉換以字符串運算符。

UIApplicationDelegate reference

deviceToken

標識了設備到APS的標記。令牌是 不透明數據類型,因爲這是提供程序在向設備發送通知時需要提交給APS服務器的形式。 出於性能原因,APS服務器需要二進制格式。

設備令牌的大小是32個字節。

請注意,設備令牌與UIDevice的uniqueIdentifier 屬性不同,因爲出於安全和隱私的原因,它必須在設備被擦除時更改。

以二進制形式存儲設備令牌。

+1

順便說一句,我得到了答案。那些用戶正在使用越獄手機:) – 2014-09-05 07:19:30

+1

@ArsalanHaider我的答案依然存在;您沒有希望使用您的代碼重新創建設備令牌。 – trojanfoe 2014-09-05 07:24:01

0

我做了這樣的說法:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { 
    NSUInteger devicetokenlen=[deviceToken length]; 
    char* devicetoken=(char*)malloc(devicetokenlen+1); 
    memcpy(devicetoken,[deviceToken bytes],devicetokenlen); 
    devicetoken[devicetokenlen]=0; 
    //... 
    free(devicetoken); 

的缺陷是你不能假設令牌始終爲32個字節長。 它可能有一天會改變。所以當你通過NULL終止的字符數組傳遞給某個地方時,你不知道它的大小。例如,令牌可能包含NULL字符。所以它更傾向於使用base64或hex或類似的東西來轉換令牌二進制數據,或者以二進制數據+大小的形式傳遞它。