Xcode 6 - удаленные уведомления в iOS8
Мое приложение использует QuickBlox, чтобы позволить пользователям общаться в чате и получать push-уведомления. Он отлично работает в iOS7 и ниже, но в iOS8 я получаю сообщение об ошибке, что удаленные уведомления не разрешены.
Пользователям iOS8 также не показывается всплывающее окно с просьбой утвердить push-уведомления.
Вот мой список
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>
И вот соответствующий код в моем файле.m
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
Любой совет?
3 ответа
Поддержка только уведомлений iOS8:
UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
Поддержка уведомлений iOS7 и iOS8:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
} else {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
Заменить свой существующий registerForRemoteNotificationTypes
строка с приведенным выше кодом.
Источник: Push-уведомления в iOS 7 и 8
iOS 8
использует новые методы регистрации для push-уведомлений. Вот полный фрагмент кода, который вы можете использовать в Xcode 5
& 6
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert) categories:nil]];
}else{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge)];
}
#else
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge)];
#endif
Попробуйте добавить следующий метод после вашего вызова registerUserNotificationSettings:
[[UIApplication sharedApplication] registerForRemoteNotifications];
Это необходимо для того, чтобы iOS8 запрашивала токен устройства с сервера APNS. В случае успеха он вызовет didRegisterForRemoteNotificationWithDeviceToken: метод вашего делегата приложения.
В iOS7 было достаточно вызвать registerForRemoteNotificationTypes:, в iOS8 вы должны вызвать и registerForRemoteNotifications, и registerUserNotificationSettings.
Я бы просто добавил комментарий к первоначальному ответу, но у меня не хватает уличного кредита для этого.