Я внедряю push-уведомления. Я хотел бы сохранить свой APNS-токен в виде строки.
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
{
NSString *tokenString = [NSString stringWithUTF8String:[newDeviceToken bytes]]; //[[NSString alloc]initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
NSLog(@"%@", tokenString);
NSLog(@"%@", newDeviceToken);
}
Первая строка кода печатает ноль. вторая печатает токен. Как я могу получить свой newDeviceToken как NSString?
ios
objective-c
apple-push-notifications
nsstring
nsdata
Шихан Алам
источник
источник
NSLog
, тот, который печатаетnewDeviceToken
?Ответы:
использовать это :
источник
Если кто-то ищет способ сделать это в Swift:
Изменить: для Swift 3
Swift 3 представляет
Data
тип с семантикой значения. Чтобы преобразоватьdeviceToken
строку в строку, вы можете сделать следующее:источник
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
qiita.com/mono0926/items/3cf0dca3029f32f54a09"%02.2hhx
?Кто-то помог мне с этим. Я просто передаю
источник
const unsigned *tokenBytes = [deviceToken bytes]; NSMutableString *hexToken = [NSMutableString string]; for (NSUInteger byteCount = 0; byteCount * 4 < [deviceToken length]; byteCount++) { [hexToken appendFormat:@"%08x", ntohl(tokenBytes[byteCount])]; }
Important: APNs device tokens are of variable length. Do not hard-code their size.
Apple говорит.Вы могли бы использовать это
источник
description
.[token appendFormat:@"%02.2hhx", data[i]];
поскольку Amazon SNS требует строчных букв.Для тех, кто хочет в Swift 3 и самый простой способ
источник
deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
Объяснение
%02.2hhx
в высоком голосе ответа :%
: Вводитx
спецификатор конверсии.02
: Минимальная ширина преобразованного значения равна 2. Если преобразованное значение имеет меньше байтов, чем ширина поля, оно должно быть дополнено0
слева..2
: Предоставляет минимальное количество цифр, отображаемых дляx
спецификатора преобразования.hh
: Указывает, чтоx
спецификатор преобразования применяется к аргументу со знаком char или unsigned char (аргумент будет повышен в соответствии с целочисленными предложениями, но его значение должно быть преобразовано в char со знаком или unsigned char перед печатью).x
: Аргумент без знака должен быть преобразован в шестнадцатеричный формат без знака в стиле "dddd"; буквы "abcdef" используются. Точность определяет минимальное количество отображаемых цифр; если конвертируемое значение может быть представлено меньшим количеством цифр, оно должно быть расширено начальными нулями. Точность по умолчанию равна 1. Результатом преобразования нуля с явной точностью нуля не должно быть символов.Для получения дополнительной информации см. Спецификацию IEEE printf .
Исходя из приведенного выше объяснения, я думаю, что лучше изменить
%02.2hhx
на%02x
или%.2x
.Для Swift 5 возможны следующие методы:
Тест выглядит следующим образом:
источник
Это мое решение, и оно хорошо работает в моем приложении:
NSData
вNSString
сstringWithFormat
источник
-description
, так что это не безопаснее, чем принятый ответ.description
deviceToken, как говорит jszumski.description
то, вызываете ли вы его напрямую или используете через другой метод, потому что формат возвращаемой строки может быть изменен в любое время. Правильное решение здесь: stackoverflow.com/a/16411517/108105Я думаю, что преобразование deviceToken в шестнадцатеричную байтовую строку не имеет смысла. Зачем? Вы отправите его на свой сервер, где он будет преобразован обратно в байты для отправки в APNS. Итак, используйте метод NSData,
base64EncodedStringWithOptions
отправьте его на сервер, а затем используйте обратные данные, декодированные base64 :) Это намного проще :)источник
В iOS 13
description
сломается, так что используйте этоДля ясности давайте разберем это и объясним каждую часть:
Метод map работает с каждым элементом последовательности. Поскольку Data - это последовательность байтов в Swift, переданное закрытие оценивается для каждого байта в deviceToken. Инициализатор String (format :) оценивает каждый байт данных (представленный анонимным параметром $ 0), используя спецификатор формата% 02x, чтобы получить заполненное нулями 2-значное шестнадцатеричное представление байта / 8-разрядного целого числа. После сбора каждого байтового представления, созданного методом map, join () объединяет каждый элемент в одну строку.
PS не использовать описание дает разные строки в iOS 12 и iOS 13 и небезопасно в соответствии с будущим объемом. Разработчики не должны были полагаться на определенный формат для описания объекта.
Для получения дополнительной информации прочитайте это .
источник
В iOS 13 описание будет в другом формате. Пожалуйста, используйте приведенный ниже код для получения токена устройства.
источник
length
в цикле for его следует изменить наlen
. По-видимому, слишком маленькое изменение для меня, чтобы внести изменения .. Но в остальном работает отлично!Это немного более короткое решение:
источник
Функциональная версия Swift
Один лайнер:
Вот в форме многоразового и самодокументируемого расширения:
В качестве альтернативы используйте
reduce("", combine: +)
вместо того,joinWithSeparator("")
чтобы ваши коллеги воспринимали вас как функционального мастера.Изменить: я изменил String ($ 0, основание: 16) на String (формат: "% 02x", $ 0), потому что однозначные числа должны иметь нулевой отступ
(Я пока не знаю, как пометить вопрос как дубликат другого , поэтому я просто опубликовал свой ответ снова)
источник
2020
токен как текст ...
или если вы предпочитаете
(результат тот же)
источник
Кидаю мой ответ в кучу. Избегайте использования разбора строк; Документами не гарантируется, что NSData.description всегда будет работать таким образом.
Swift 3 Реализация:
источник
Я пытался проверить два разных метода с форматом
"%02.2hhx"
и"%02x"
и результат в том, что самый быстрый -
"%02x"
в среднем 2,0 против 2,6 для уменьшенной версии:источник
Использование updateAccumulationResult более эффективно, чем различные другие подходы, найденные здесь, так что вот самый быстрый способ упорядочить ваши
Data
байты:источник
Для Свифта:
источник
Как насчет однострочного решения?
Цель С
стриж
источник
Вот как вы это делаете в Xamarin.iOS
источник
источник
Swift:
источник
источник
стриж
источник
Используйте отличную категорию!
// .h файл
// .m файл
@конец
// AppDelegate.m
Работает отлично!
источник
Свифт 3:
Если кто-то ищет способ получить токен устройства в Swift 3. Используйте приведенный ниже измененный фрагмент.
источник
источник
Размещенное здесь решение @kulss, хотя и не обладающее элегантностью, но обладающее простотой, больше не работает в iOS 13, поскольку
description
для NSData будет работать по-другому. Вы все еще можете использовать,debugDescription
хотя.источник
Попробуйте это, если данные не заканчиваются нулем.
NSString* newStr = [[NSString alloc] initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
источник
источник