Получить токен устройства для push-уведомлений
Я работаю над push-уведомлениями. Я написал следующий код для получения токена устройства.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Add the view controller's view to the window and display.
[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];
NSLog(@"Registering for push notifications...");
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
return YES;
}
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
NSLog(@"This is device token%@", deviceToken);
}
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSString *str = [NSString stringWithFormat: @"Error: %@", err];
NSLog(@"Error %@",err);
}
Я могу успешно запустить приложение на устройстве, но не могу получить идентификатор устройства на консоли.
У меня нет проблем с сертификацией и предоставлением профилей.
17 ответов
Вы должны использовать следующий код для получения токена устройства: -
Objective-C
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"content---%@", token);
}
Swift 3.0
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
// kDeviceToken=tokenString
print("deviceToken: \(tokenString)")
}
Чтобы получить токен-устройство, вы можете сделать несколько шагов:
1) Включите APNS (Apple Push Notification Service) как для сертификации разработчика, так и для сертификации распространения, затем повторно загрузите эти два файла.
2) Повторно загрузите как файл Provisioning, так и Distribute Provisioning.
3) В интерфейсе Xcode: загрузка настроек для PROJECT и TARGETS с предоставлением двух файлов.
4) Наконец, вам нужно добавить приведенный ниже код в файл AppDelegate, чтобы получить Token Device (примечание: запустить приложение на реальном устройстве).
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];
NSLog(@"Registering for push notifications...");
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
return YES;
}
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
NSLog(@"%@", str);
}
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSString *str = [NSString stringWithFormat: @"Error: %@", err];
NSLog(@"%@",str);
}
С помощью description
как следует из многих из этих ответов, это неправильный подход - даже если вы заставите его работать, он сломается в iOS 13+.
Вместо этого вы должны убедиться, что используете фактические двоичные данные, а не просто их описание. Андрей Гаган неплохо разобрался с решением Objective C, но, к счастью, в Swift все намного проще:
Swift 4.2 работает в iOS 13+
// credit to NSHipster (see link above)
// format specifier produces a zero-padded, 2-digit hexadecimal representation
let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()
Objective C для iOS 13+, любезно предоставлен ответом Васифа Сауда
Скопируйте и вставьте приведенный ниже код в AppDelegate.m, чтобы распечатать токен APN устройства.
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSUInteger dataLength = deviceToken.length;
if (dataLength == 0) {
return;
}
const unsigned char *dataBuffer = (const unsigned char *)deviceToken.bytes;
NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
for (int i = 0; i < dataLength; ++i) {
[hexString appendFormat:@"%02x", dataBuffer[i]];
}
NSLog(@"APN token:%@", hexString);
}
Следующий код используется для получения токена устройства.
// Prepare the Device Token for Registration (remove spaces and < >)
NSString *devToken = [[[[deviceToken description]
stringByReplacingOccurrencesOfString:@"<"withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString: @" " withString: @""];
NSString *str = [NSString
stringWithFormat:@"Device Token=%@",devToken];
UIAlertView *alertCtr = [[[UIAlertView alloc] initWithTitle:@"Token is " message:devToken delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
[alertCtr show];
NSLog(@"device token - %@",str);
И Swift-версия ответа Васифа:
Swift 2.x
var token = deviceToken.description.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>"))
token = token.stringByReplacingOccurrencesOfString(" ", withString: "")
print("Token is \(token)")
Обновление для Swift 3
let deviceTokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
Начиная с iOS 13 Apple изменилась [deviceToken description]
выход. Теперь это так{length=32,bytes=0x0b8823aec3460e1724e795cba45d22e8...af8c09f971d0dabc}
что неверно для токена устройства.
Я предлагаю использовать этот фрагмент кода для решения проблемы:
+ (NSString *)stringFromDeviceToken:(NSData *)deviceToken {
NSUInteger length = deviceToken.length;
if (length == 0) {
return nil;
}
const unsigned char *buffer = deviceToken.bytes;
NSMutableString *hexString = [NSMutableString stringWithCapacity:(length * 2)];
for (int i = 0; i < length; ++i) {
[hexString appendFormat:@"%02x", buffer[i]];
}
return [hexString copy];
}
Он будет работать на iOS13 и ниже.
Если вы по-прежнему не получаете токен устройства, попробуйте ввести следующий код, чтобы зарегистрировать свое устройство для push-уведомлений.
Это также будет работать на ios8 или более.
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
if ([UIApplication respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound
categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
} else {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeSound];
}
#else
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeSound];
#endif
В вашем Appdelegate, в didRegisterForRemoteNotificationsWithDeviceToken
метод:
NSString *deviceTokenString = deviceToken.description;
deviceTokenString = [deviceTokenString stringByReplacingOccurrencesOfString:@"[< >]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, deviceTokenString.length)];
NSLog(deviceTokenString.description);
Получить токен устройства в Swift 3
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
print("Device token: \(deviceTokenString)")
}
В настройках сборки установите код подписи Provision Profile, если у вас есть сертификат APN Enable, тогда вы обязательно получите идентификатор токена. и удалить
Профиль обеспечения: автоматический
и установить
Профиль обеспечения: Ваш сертификат профиля обеспечения.
Получить токен устройства в Swift 3
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = String(format: "%@", deviceToken as CVarArg).trimmingCharacters(in: CharacterSet(charactersIn: "<>")).replacingOccurrences(of: " ", with: "")
print(token)
}
Используйте следующий код для получения токена устройства:
func application (_ application: UIApplication, DidRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {}
Вы можете обратиться к Netmera Guide, чтобы узнать о полезных нагрузках push-уведомлений и получить дополнительную информацию о push-уведомлениях.
Для цели-C
Есть некоторые изменения для push-токена iOS 13.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *token = @"";
if (@available(iOS 13, *)) {
NSUInteger length = deviceToken.length;
if (length == 0) {
token = @"";
}
const unsigned char *buffer = deviceToken.bytes;
NSMutableString *actualToken = [NSMutableString stringWithCapacity:(length * 2)];
for (int i = 0; i < length; ++i) {
[actualToken appendFormat:@"%02x", buffer[i]];
}
token = [actualToken copy];
} else {
token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
}
NSLog(@"My token is: %@", token);
}
Swift 4 Это работает для меня:
Шаг 1 в " ЦЕЛИ". Нажмите "Добавить возможность" и выберите " Push-уведомления".
Шаг 2 в AppDelegate.swift добавьте следующий код:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound]) { (didAllow, error) in
}
UIApplication.shared.registerForRemoteNotifications()
return true
}
//Get device token
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
print("The token: \(tokenString)")
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenParts = deviceToken.map { data -> String in
return String(format: "%02.2hhx", data)
}
let token = tokenParts.joined()
print("Token\(token)")
}
Чтобы получить токен устройства, используйте следующий код, но вы можете получить токен устройства только с помощью физического устройства. Если вам необходимо отправить токен устройства, то при использовании симулятора вы можете поставить нижеприведенное условие.
if(!(TARGET_IPHONE_SIMULATOR))
{
[infoDict setValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"DeviceToken"] forKey:@"device_id"];
}
else
{
[infoDict setValue:@"e79c2b66222a956ce04625b22e3cad3a63e91f34b1a21213a458fadb2b459385" forKey:@"device_id"];
}
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSLog(@"My token is: %@", deviceToken);
NSString * deviceTokenString = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""] stringByReplacingOccurrencesOfString: @" " withString: @""];
NSLog(@"the generated device token string is : %@",deviceTokenString);
[[NSUserDefaults standardUserDefaults] setObject:deviceTokenString forKey:@"DeviceToken"];
}