Я работаю над 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);
}
Я могу успешно запустить приложение на устройстве, но не могу получить идентификатор устройства на консоли.
У меня нет проблем с сертификацией и профилями подготовки.
Ответы:
ПРИМЕЧАНИЕ. Приведенное ниже решение больше не работает на устройствах iOS 13+ - оно будет возвращать данные мусора .
Вместо этого используйте следующий код:
+ (NSString *)hexadecimalStringFromData:(NSData *)data { NSUInteger dataLength = data.length; if (dataLength == 0) { return nil; } const unsigned char *dataBuffer = (const unsigned char *)data.bytes; NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)]; for (int i = 0; i < dataLength; ++i) { [hexString appendFormat:@"%02x", dataBuffer[i]]; } return [hexString copy]; }
Решение, которое работало до iOS 13:
Цель-C
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]]; token = [token stringByReplacingOccurrencesOfString:@" " withString:@""]; NSLog(@"this will return '32 bytes' in iOS 13+ rather than the token", token); }
Swift 3.0
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("this will return '32 bytes' in iOS 13+ rather than the token \(tokenString)") }
источник
Чтобы получить Token Device, вы можете сделать несколько шагов :
1) Включите APNS (Apple Push Notification Service) как для сертификации разработчиков, так и для распространения сертификатов, затем повторно загрузите эти два файла.
2) Повторно загрузите файл инициализации разработчика и файл распределения.
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);
источник
description
.И версия Swift ответа Wasif:
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()
источник
description
для двоичных данных (см. Любой другой ответ)Если вы по-прежнему не получаете токен устройства, попробуйте ввести следующий код, чтобы зарегистрировать устройство для 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
источник
Начиная с 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 и ниже.
источник
description
всегда был неправильным. И это только одно из возможных решений для преобразования токена в строку. Намного более простым решением является преобразованиеNSData
вNSString
стандартную кодировку base64.Получите токен устройства в Swift 3
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("Device token: \(deviceTokenString)") }
источник
В вашем AppDelegate в
didRegisterForRemoteNotificationsWithDeviceToken
методе:Обновлено для Swift:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { print("\(deviceToken.reduce("") { $0 + String(format: "%02.2hhx", arguments: [$1]) })") }
источник
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)") }
источник
В настройках сборки установите профиль обеспечения подписи кода, если у вас есть сертификат APN Enable, вы обязательно получите идентификатор токена. и удалить
Профиль предоставления: автоматический
и установить на
Профиль обеспечения: ваш сертификат профиля обеспечения.
источник
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"]; }
источник