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引入了Data
types和值语义。 要将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)") }