Iphone设备令牌 – NSData或NSString

我正在以NSData对象的forms接收iPhone设备令牌。 当我testing我的通知脚本function时,我只从日志中复制了该对象,通知进行得很顺利。 但是,当我现在尝试自动执行此操作时,我将设备令牌作为ASCII编码的string以variables的forms发送

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

我得到的string有一些时髦的字符,并且看起来类似于这个"å-0¾fZÿ÷ʺÎUQüRáqEªfÔk«"

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

我需要解码的东西,以及如何?

Regardz

好的,我find了一个解决scheme。 如果任何人有同样的问题,忘记ASCII编码,只需使用以下几行string:

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

如果有人正在寻找一种方法在Swift中做到这一点:

 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)") } 

编辑:对于Swift 3

Swift 3引入了Datatypes和值语义。 要将deviceToken转换为string,可以执行如下操作:

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

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

  - (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中,稍后使用它将其发送到我们的服务器。

我不认为这是一个好的解决scheme,因为您必须在将通知发送到Apple服务器之前重新构buildstring。 使用Base64编码传输string或类似的东西。

将设备标记转换为hexstring的另一种方法

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

对于Swift 3:

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

其他方法

创build数据扩展以获取hexstring

 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)") }