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.

Я бы просто добавил комментарий к первоначальному ответу, но у меня не хватает уличного кредита для этого.

Другие вопросы по тегам