设备令牌NULL

时间:2014-09-05 06:49:28

标签: ios notifications push token device

我有一个奇怪的问题,我不能自己复制。我的一些用户正在为Apple推送通知返回空白(或空)设备令牌。它可能发生在5%的用户身上。 任何人都有同样的问题或对此有所了解。

我获取设备令牌的代码是:

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

2 个答案:

答案 0 :(得分:3)

您不应该以这种方式操纵设备令牌,尤其是不使用description方法,这是一种调试辅助工具,而不是转换为字符串操作符。< / p>

来自UIApplicationDelegate reference

  

deviceToken

     

将设备标识为APS的令牌。令牌是一个    opaque 数据类型,因为这是提供程序所需的表单   在向设备发送通知时提交给APS服务器。   出于性能原因,APS服务器需要二进制格式。

     

设备令牌的大小为32个字节。

     

请注意,设备令牌与uniqueIdentifier不同   UIDevice的财产,因为出于安全和隐私的原因,它   擦拭设备时必须更换。

以二进制形式存储设备令牌。

答案 1 :(得分: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终止的char数组传递令牌时,你不知道令牌的大小。例如,令牌可能包含NULL字符。所以它首选使用base64或hex或类似的东西转换令牌二进制数据,或者以二进制数据+大小形式传递它。