保存DeviceToken以便以后在Apple推送通知服务中使用

aza*_*arp 11 push-notification devicetoken ios

在我的iPhone应用程序中,我从Apple获取设备令牌,我在Delegate文件中分配了一个公共属性,如下所示:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
   self.dToken = [[NSString alloc] initWithData:deviceToken encoding:NSUTF8StringEncoding]; 
}
Run Code Online (Sandbox Code Playgroud)

dToken属性声明如下:

NSString *dToken;

@property (nonatomic,retain) NSString *dToken;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从另一个文件中检索设备令牌时,我得到了null值.

+(NSString *) getDeviceToken
{
  NSString *deviceToken = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] dToken];

    NSLog(@" getDeviceToken = %@",deviceToken);  // This prints NULL

    return deviceToken; 

}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Nek*_*kto 35

我建议你用这种方式将token转换为string:

self.dToken = [[[deviceToken description]
                    stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] 
                    stringByReplacingOccurrencesOfString:@" " 
                    withString:@""];
Run Code Online (Sandbox Code Playgroud)

更新:正如很多人提到的那样,最好使用下一种方法转换NSData *NSString *:

@implementation NSData (Conversion)
- (NSString *)hexadecimalString
{
  const unsigned char *dataBuffer = (const unsigned char *)[self bytes];

  if (!dataBuffer) {
    return [NSString string];
  }

  NSUInteger          dataLength  = [self length];
  NSMutableString     *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];

  for (int i = 0; i < dataLength; ++i) {
    [hexString appendFormat:@"%02lx", (unsigned long)dataBuffer[i]];
  }

  return hexString;
}
@end
Run Code Online (Sandbox Code Playgroud)

  • 上面的代码(至少目前为止)有效但不是好形式.读取description属性不应被视为HEX编码字符串的可接受机制,因为它用于调试描述,而不是用于编码!有关序列化令牌的更正确方法,请参阅http://stackoverflow.com/questions/1305225/best-way-to-serialize-a-nsdata-into-an-hexadeximal-string (11认同)
  • 你确定调用了`didRegisterForRemoteNotificationsWithDeviceToken`并且初始化了dToken吗? (2认同)