2010-09-10 64 views
2

是否有可能从应用程序返回设备令牌:(UIApplication *)applicationDisRegisterForRemoteNotificationsWithDeviceToken :(NSData *)deviceToken方法?由于我对PHP不太擅长,我希望我的用户能够手动将令牌输入到计算机上的程序中,该程序将用于发送通知。但是,我无法从这种方法获得令牌。它使用NSLog记录正确,但是当我使用NSString initWithData时,我总是会得到一些神秘的东西。我想编码是错的?APN设备令牌的编码是什么?

感谢您的帮助提前!

回答

7

令牌是一个NSData对象,它指向数据的原始二进制blob,而不是字符串。将其转换为字符串的两种最常见的方式是:

  1. Base64编码,它 下载http://projectswithlove.com/projects/NSData_Base64.zip
NSString *str = [deviceToken base64EncodedStringWithoutNewlines]; 
  • 使用的NSData的 - 描述得到一个字符串十六进制转储并清理它
  • NSString *str = [[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""]; 
    str = [str stringByReplacingOccurrencesOfString:@">" withString:@""]; 
    str = [str stringByReplacingOccurrencesOfString: @" " withString: @""]; 
    

    我更喜欢#1,因为后者依赖于内部方式的NSData的-description通话作品,但无论哪种应该工作。

    +0

    我使用base64方法,但使用'url安全'base64这是一个编码,使得结果字符串可接受为 - 在URL中等。原始base64使用标准的'+'和'/'字符Base64分别是r被' - '和'_'所取代。 – 2012-11-27 14:23:43

    3

    你可以得到的十六进制字符串,而不必担心NSDatadescription方法的行为,具有:

    + (NSString *)hexadecimalStringFromData:(NSData *)data { 
        NSMutableString *hexToken; 
        const unsigned char *iterator = (const unsigned char *) [data bytes]; 
        if (iterator) { 
         hexToken = [[NSMutableString alloc] init]; 
         for (NSInteger i = 0; i < data.length; i++) { 
          [hexToken appendString:[NSString stringWithFormat:@"%02lx", (unsigned long) iterator[i]]]; 
         } 
         return hexToken; 
        } 
        return nil; 
    } 
    
    0

    令牌是NSData.You可以转换到string.And删除<和>和空格

    NSString *devToken = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
    devToken = [devToken stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    
    
    NSLog(@"token: %@",devToken);