我有一个奇怪的问题,我不能自己复制。我的一些用户正在为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) ;
}
答案 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或类似的东西转换令牌二进制数据,或者以二进制数据+大小形式传递它。