Iphone设备令牌-NSData或NSString

问题描述:

我正在以NSData对象的形式接收iPhone设备令牌。 当我测试了我的通知脚本函数时,我只从日志中复制了该对象,并且通知正常。然而,当我现在尝试自动做到这一点,我向设备发送令牌作为ASCII编码字符串中的变量Iphone设备令牌-NSData或NSString

self.deviceToken = [[NSString alloc] initWithData:webDeviceToken encoding:NSASCIIStringEncoding]; 

的字符串,我得到了一些时髦的人物和类似于这样"å-0¾fZÿ÷ʺÎUQüRáqEªfÔk«"

形式

当服务器端脚本将通知发送给该令牌时,我没有收到任何内容。

我是否需要解码某些东西以及如何解码?

Regardz

+0

我发现了另一个解决方案在这里,看上去更加面向未来的,则“说明”的方法。 http://*.com/questions/1959600/how-to-use-objective-c-to-send-device-token-for-push-notifications-and-other-use – 2013-03-19 09:07:56

+0

这很奇怪,我认为这NSData *不应该是特殊的对象,所以我尝试使用NSUTF8StringEncoding并获得不同的结果。使用** description **方法将NSData转换为NSString是不可想象的!一些苹果文档有关? – Itachi 2015-07-21 09:17:54

好的,我找到了解决方案。如果任何人有同样的问题,忘掉ASCII编码,只要有以下行字符串:

NSString *deviceToken = [[webDeviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""]; 
+7

请停止upvoting这个答案,这使用令牌.description - 就是这样一个描述。它是为了调试或显示而被人读取的。 “”不是令牌的一部分,它们仅用于显示格式。如果他们想要,苹果公司可以将其改为“[”或“ - ”或其他什么。使用其中一个将数据转换为十六进制字符串的答案。 – 2016-05-25 03:37:09

我不认为这是一个很好的解决方案,因为你发送通知之前重建串Apple服务器。使用Base64编码传输字符串或类似的东西。

+0

发送字符串从服务器端工作,没有任何重建或修改 – Mladen 2009-10-19 09:31:36

+0

但据我所知,您正在删除和修剪字符...您是否尝试使用该标记发送通知,它的工作?怎么来的? – 2009-10-19 09:51:14

+0

我已经尝试过,它工作。 – Mladen 2009-10-19 09:56:25

我发现这个解决方案更好,因为iOS可以在将来的版本中更改描述的用法,所以在将来使用数据的描述属性可能不可靠。 我们可以通过从数据标记字节中创建十六进制令牌来直接使用它。

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { 
const unsigned *tokenBytes = [deviceToken bytes]; 
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x", 
        ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]), 
        ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]), 
        ntohl(tokenBytes[6]), ntohl(tokenBytes[7])]; 
[[MyModel sharedModel] setApnsToken:hexToken]; 

}

我们也可以存储在我们的NSUserDefaults的设备令牌和使用它以后将其发送到我们的服务器。

设备令牌转换为六十进制字符串

NSUInteger capacity = [deviceToken length] * 2; 
NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity]; 
const unsigned char *dataBuffer = [deviceToken bytes]; 
NSInteger i; 
for (i=0; i<[deviceToken length]; ++i) { 
    [stringBuffer appendFormat:@"%02X", (NSUInteger)dataBuffer[i]]; 
} 
NSLog(@"token string buffer is %@",stringBuffer); 

如果有人正在寻找一种方式,斯威夫特做到这一点的另一种方式:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes) 
    var tokenString = "" 

    for i in 0..<deviceToken.length { 
     tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]]) 
    } 

    print("tokenString: \(tokenString)") 
} 

编辑:对于斯威夫特3

Swift 3引入了带有值语义的Data类型。要将deviceToken转换为字符串,你可以做如下:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 

    var token: String = "" 
    for i in 0..<deviceToken.count { 
     token += String(format: "%02.2hhx", deviceToken[i] as CVarArg) 
    } 

    print(token) 
} 
+0

Thx!正是我需要的! – kimimaro 2015-01-25 04:01:09

+1

令人惊讶的是,在swift中没有简单的方法从NSData设备令牌对象中获取正确解码的字符串数据。但是这是一个例子,@sascha是我遇到的第一个实际工作的东西!谢谢。 – Shiprack 2015-02-21 14:35:12

+1

现在将其移至NSData扩展名并将其称为'hexadecimalStringDescription()' – Eimantas 2015-11-13 09:09:19

对于斯威夫特3:

var tokenString: String = "" 
    for i in 0..<deviceToken.count { 
     tokenString += String(format: "%02.2hhx", deviceToken[i] as CVarArg) 
    } 

    print(tokenString) 

其他方法

创建数据扩展获得比特产

extension Data { 
    var hexString: String { 
     return map { String(format: "%02.2hhx", arguments: [$0]) }.joined() 
    } 
} 

并称之为扩展在

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
    let tokenString = deviceToken.hexString() 
    print("token: \(tokenString)") 
} 
+0

这适用于Swift 2.0。谢谢。 – 2015-12-11 07:38:25

+0

不要依赖.description,你从中得到的格式没有记录,并且在技术上可能会改变。 deviceToken.description只能用于调试目的。使用其中一个将字节转换为十六进制字符串的答案。 – 2016-05-25 03:33:12

+2

同意。不要使用这个。当使用PKPushCredentials时,描述现在返回“32字节” – Tony 2016-10-03 19:06:38