Получить токен устройства в iOS 8
Мне нужен токен устройства, чтобы реализовать push-уведомление в моем приложении.
Как я могу получить токен устройства, так как метод didRegisterForRemoteNotificationsWithDeviceToken
не работает на iOS 8.
Я пробовал этот код в делетете приложения, но он не дает мне токен устройства.
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
Ответы
Ответ 1
Прочтите код в UIApplication.h.
Вы будете знать, как это сделать.
Во-первых:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
добавить код, подобный этому
#ifdef __IPHONE_8_0
//Right, that is the point
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
#else
//register to receive notifications
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif
, если вы не используете как Xcode 5, так и Xcode 6, попробуйте этот код
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
(Спасибо за @zeiteisen @dmur)
Во-вторых:
Добавьте эту функцию
#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
//register to receive notifications
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
//handle the actions
if ([identifier isEqualToString:@"declineAction"]){
}
else if ([identifier isEqualToString:@"answerAction"]){
}
}
#endif
И вы можете получить deviceToken в
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
если он все еще не работает, используйте эту функцию и NSLog ошибка
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
Ответ 2
Добавление небольшой проверки в ответ @Madao в случае, если у вас возникли сбои в более старых версиях iOS:
#ifdef __IPHONE_8_0
if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
#endif
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeNewsstandContentAvailability;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
Что делает макрос __IPHONE_8_0
, просто позволяет вам скомпилировать в старых версиях xCode/iOS, вы не получаете ошибок компиляции или предупреждений, но запуск кода на устройствах с iOS 7 или ниже приведет к сбою.
Ответ 3
Чтобы получить токен устройства в iOS8 +
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//This code will work in iOS 8.0 xcode 6.0 or later
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeNewsstandContentAvailability| UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
return YES;
}
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSString* deviceToken = [[[[deviceToken description]
stringByReplacingOccurrencesOfString: @"<" withString: @""]
stringByReplacingOccurrencesOfString: @">" withString: @""]
stringByReplacingOccurrencesOfString: @" " withString: @""] ;
NSLog(@"Device_Token -----> %@\n",deviceToken);
}
Ответ 4
Помимо остальных снисходительных ответов на этот вопрос, наиболее вероятная причина того, что эта проблема может возникнуть для информированного разработчика, который применил все необходимые методы делегирования, заключается в том, что они используют профиль профилирования дикой карты (почему бы и нет?) Так легко создавать и тестировать приложения для разработки!)
В этом случае вы, вероятно, увидите ошибку Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitlement string found for application"
Чтобы протестировать уведомления, вам действительно нужно вернуться к 2000 году и опоздать, зайдите на сайт developer.apple.com и настройте профиль подготовки приложений для приложений с включенными push-уведомлениями.
- Создайте идентификатор приложения, соответствующий идентификатору вашего пакета приложений. Обязательно отметьте "push notifications" (в настоящее время второй вариант снизу).
- Создайте профиль обеспечения для этого идентификатора приложения.
- Пройдите все остальные шаги, которые мы все хотели бы забыть.
- Profit!
Ответ 5
В своей учетной записи разработчика убедитесь, что у вас есть настройки push-уведомлений правильно в вашем идентификаторе приложения, а затем вам необходимо восстановить и загрузить профиль обеспечения. Моя проблема заключалась в том, что я загрузил профиль подготовки, но xcode работал некорректно. Чтобы исправить это, перейдите к настройкам целевой сборки, прокрутите вниз до пункта "Подписание кода" в разделе "Профиль подготовки" убедитесь, что вы используете правильный профиль подготовки, который соответствует имени созданного вами (должно быть выпадающее меню с параметрами, если вы установили более одного).
Ответ 6
@madoa ответ абсолютно правильный. Просто отметьте, что он не работает в симуляторе.
В этом случае
-(void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
вызывается с ошибкой REMOTE_NOTIFICATION_SIMULATOR_NOT_SUPPORTED_NSERROR
Ответ 7
Вот решение.
в applicationDidFinishLaunchingWithOptions:
{
UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
}
- (void)application:(UIApplication*)application didRegisterUserNotificationSettings:(nonnull UIUserNotificationSettings *)notificationSettings
{
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(nonnull NSError *)error
{
NSLog(@" Error while registering for remote notifications: %@", error);
}
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(nonnull NSData *)deviceToken
{
NSLog(@"Device Token is : %@", deviceToken);
}