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
好的,我找到了解决方案。如果任何人有同样的问题,忘掉ASCII编码,只要有以下行字符串:
NSString *deviceToken = [[webDeviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
请停止upvoting这个答案,这使用令牌.description - 就是这样一个描述。它是为了调试或显示而被人读取的。 “”不是令牌的一部分,它们仅用于显示格式。如果他们想要,苹果公司可以将其改为“[”或“ - ”或其他什么。使用其中一个将数据转换为十六进制字符串的答案。 – 2016-05-25 03:37:09
我发现这个解决方案更好,因为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)
}
对于斯威夫特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)")
}
这适用于Swift 2.0。谢谢。 – 2015-12-11 07:38:25
不要依赖.description,你从中得到的格式没有记录,并且在技术上可能会改变。 deviceToken.description只能用于调试目的。使用其中一个将字节转换为十六进制字符串的答案。 – 2016-05-25 03:33:12
同意。不要使用这个。当使用PKPushCredentials时,描述现在返回“32字节” – Tony 2016-10-03 19:06:38
我发现了另一个解决方案在这里,看上去更加面向未来的,则“说明”的方法。 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
这很奇怪,我认为这NSData *不应该是特殊的对象,所以我尝试使用NSUTF8StringEncoding并获得不同的结果。使用** description **方法将NSData转换为NSString是不可想象的!一些苹果文档有关? – Itachi 2015-07-21 09:17:54