Подтвердить что ты не робот

Iphone-токен устройства - NSData или NSString

Я получаю токен устройства iPhone в виде объекта NSData. Когда я тестировал свои функции уведомлений script, я только скопировал этот объект из журнала, и уведомления пошли хорошо. Однако, когда я пытаюсь сделать это автоматически, я отправляю токен устройства как кодированную в ASCII строку в виде переменной

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

В строке, которую я получаю, есть некоторые фанки-персонажи и выглядит примерно так: "å-0¾fZÿ÷ʺÎUQüRáqEªfÔk«"

Когда серверная сторона script отправляет уведомление этому токену, я ничего не получаю.

Нужно ли что-то расшифровать и как?

Regardz

4b9b3361

Ответ 1

Хорошо, я нашел решение. Если у кого-то есть такая же проблема, забудьте о кодировке ASCII, просто введите строку со следующими строками:

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

Ответ 2

Если кто-то ищет способ сделать это в 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 со значениями семантики. Чтобы преобразовать 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

Я нашел это решение лучше, поскольку 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 и использовать его позже, чтобы отправить его на наш сервер.

Ответ 4

Я не считаю это хорошим решением, так как вам необходимо восстановить строку перед отправкой уведомлений на серверы Apple. Используйте кодировку Base64 для передачи строк или чего-то подобного.

Ответ 5

Другой способ преобразования токена устройства в шестнадцатеричную десятичную строку

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

Ответ 6

Для 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: [$0]) }.joined()
    }
}

И назовите это расширение в

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let tokenString = deviceToken.hexString()
    print("token: \(tokenString)")
}