Как я могу получить токен устройства для удаленного уведомления в iOS 8?
Я использовал метод didRegisterForRemoteNotificationsWithDeviceToken
в AppDelegate
в iOS < 8, и он вернул токен устройства. Но в iOS 8 это не так.
Удаленное уведомление iOS 8
Ответ 1
Прочтите код в UIApplication.h.
Вы будете знать, как это сделать.
Во-первых:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
добавить код, подобный этому
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
#ifdef __IPHONE_8_0
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert
| UIUserNotificationTypeBadge
| UIUserNotificationTypeSound) categories:nil];
[application registerUserNotificationSettings:settings];
#endif
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
, если вы не используете как 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
Способ регистрации для iOS 8 и поддержки старых версий
UIApplication *application = [UIApplication sharedApplication];
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge
|UIUserNotificationTypeSound
|UIUserNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
а в делегате приложения добавьте
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
iOS8 может получать тихие уведомления без запроса разрешения. Вызов
- (void)registerForRemoteNotifications
. После этого application:didRegisterForRemoteNotificationsWithDeviceToken:
будет называться
Примечание: обратный вызов с токеном вызывается только в том случае, если приложение успешно зарегистрировалось для уведомлений пользователей с помощью функции ниже или если включена функция обновления фона.
Проверьте настройки для вашего приложения, если включен тип уведомления. Если нет, вы не получите токен устройства.
Теперь вы можете получать тихие уведомления с помощью
aps {
content-available: 1
}
в полезной нагрузке уведомления
Но уведомления, которые появляются, все еще нуждаются в разрешении. Вызов
UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[application registerUserNotificationSettings:notificationSettings];
Этот код должен запрашивать разрешение.
Теперь вы должны быть готовы получать push-уведомления
Ответ 3
В моем случае я сделал необходимые обновления для запроса push-уведомления для iOS 7 и iOS 8, однако я не реализовал новый обратный вызов, когда пользователь iOS 8 предоставляет доступ. Мне нужно было добавить этот метод к моему делегату приложения.
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
Ответ 4
Если вы используете Xamarin.iOS для создания своего мобильного приложения, вы можете использовать этот фрагмент кода для запроса регистрации push-уведомлений
if (UIDevice.CurrentDevice.CheckSystemVersion(8,0))
{
UIUserNotificationType userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
UIUserNotificationSettings settings = UIUserNotificationSettings.GetSettingsForTypes(userNotificationTypes, null);
UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
}
else
{
UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
}
Также вам нужно переопределить метод DidRegisterUserNotificationSettings
, чтобы получить токен устройства, возвращенный с сервера APNS:
public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings)
{
application.RegisterForRemoteNotifications();
}
Ответ 5
Ответ Мадао (fooobar.com/questions/68902/...) прав, но....
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
должен быть более "правильным"
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
Эти флаги имеют одинаковые значения битовой маски, и поэтому оба они будут работать, но UIUserNotificationSettings
требует UIUserNotificationType
not UIRemoteNotificationType
.
Кроме того, я бы назвал
[application registerUserNotificationSettings:settings];
В методе AppDelegate
(в зависимости от предоставленных прав)
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
Ответ 6
Я считаю, что лучший способ сохранить обратную совместимость можно с этим подходом, он работает для моего дела, надеюсь, для вас. Также довольно легко понять.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
Ответ 7
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings =
[UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
[application registerForRemoteNotifications];