[英]Iphone device token - NSData or NSString
我正在以NSData
对象的形式接收iPhone设备令牌。 当我测试通知脚本功能时,我仅从日志中复制了该对象,通知运行正常。 但是,当我现在尝试自动执行此操作时,我会将设备令牌作为ASCII编码的字符串以变量的形式发送
self.deviceToken = [[NSString alloc] initWithData:webDeviceToken encoding:NSASCIIStringEncoding];
我得到的字符串带有一些时髦的字符,看起来类似于此"å-0¾fZÿ÷ʺÎUQüRáqEªfÔk«"
当服务器端脚本将通知发送到该令牌时,我什么也没收到。
我需要解码什么东西吗?
雷加兹
好的,我找到了解决方案。 如果有人遇到相同的问题,则不用担心ASCII编码,只需使用以下几行来制作字符串:
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引入了具有值语义的Data
类型。 要将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)
}
我发现此解决方案更好,因为iOS可以在将来的版本中更改描述的用法,因此将来对数据使用description属性可能不可靠。 我们可以通过从数据令牌字节创建十六进制令牌来直接使用它。
- (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中,并在以后使用它将其发送到我们的服务器。
我认为这不是一个好的解决方案,因为您必须在将通知发送到Apple服务器之前重建字符串。 使用Base64编码来传输字符串或类似内容。
将设备令牌转换为十六进制字符串的另一种方法
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)
其他方法
创建数据扩展名以获取十六进制字符串
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)")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.