Токен устройства Iphone-NSData или NSString
Я получаю токен устройства iPhone в виде
6 ответов
Ок, я нашел решение. Если у кого-то есть такая же проблема, забудьте о кодировке 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)")
}
Edit: Для Swift 3
Swift 3 представляет Data
type, с семантикой значений. Чтобы преобразовать 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)
}
Я нашел это решение лучше, так как 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 и использовать его позже, чтобы отправить его на наш сервер.
Я не думаю, что это хорошее решение, так как вам нужно восстановить строку перед отправкой уведомлений на серверы 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)
Другой Способ
создать расширение данных для получения hexstring
extension Data {
var hexString: String {
return map { String(format: "%02.2hhx", arguments: []) }.joined()
}
}
и вызовите это расширение в
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenString = deviceToken.hexString()
print("token: \(tokenString)")
}