Подтвердить что ты не робот

Устройство с поддержкой iOS 8 не получает уведомления PUSH после обновления кода

Недавно я обновил один из моих тестовых iphones до iOS 8, а затем обновил регистрационный код PUSH как показано ниже (с использованием xCode 6)

-(BOOL)hasNotificationsEnabled {

    NSString *iOSversion = [[UIDevice currentDevice] systemVersion];
    NSString *prefix = [[iOSversion componentsSeparatedByString:@"."] firstObject];
    float versionVal = [prefix floatValue];


    if (versionVal >= 8)
    {

        NSLog(@"%@", [[UIApplication sharedApplication]  currentUserNotificationSettings]);
        //The output of this log shows that the app is registered for PUSH so should receive them

        if ([[UIApplication sharedApplication] currentUserNotificationSettings].types != UIUserNotificationTypeNone) {

            return YES;

        }

    }
    else
    {
        UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
        if (types != UIRemoteNotificationTypeNone){
            return YES;
        }

    }

    return NO;
}

-(void)registerForPUSHNotifications {

    NSString *iOSversion = [[UIDevice currentDevice] systemVersion];
    NSString *prefix = [[iOSversion componentsSeparatedByString:@"."] firstObject];
    float versionVal = [prefix floatValue];


    if (versionVal >= 8)
    {


            //for iOS8
        UIUserNotificationSettings *settings =
        [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert |
         UIUserNotificationTypeBadge |
         UIUserNotificationTypeSound categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];


    }
    else
    {

            [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];


    }
}

Несмотря на это обновление и тот факт, что [[UIApplication sharedApplication] currentUserNotificationSettings] показывает, что PUSH включен для устройства, я не получаю уведомления PUSH.

Я использую Parse и делаю все по книге, насколько это возможно (https://parse.com/tutorials/ios-push-notifications).

Кто-нибудь испытывает ту же проблему? Есть ли что-то еще, что я могу потерять?

4b9b3361

Ответ 1

Способ регистрации для push-уведомлений был изменен в iOS 8: Ниже приведен код для всех версий до iOS 9:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])
{
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];

}
else
{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}

Если вы хотите проверить, включены ли push-уведомления или нет, используйте код ниже:

- (BOOL) pushNotificationOnOrOff
{
    if ([UIApplication instancesRespondToSelector:@selector(isRegisteredForRemoteNotifications)]) {
        return ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]);
    } else {
        UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
        return (types & UIRemoteNotificationTypeAlert);
    }
}

#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

Выше код будет работать только на Xcode 6+...

Ответ 2

Добавьте эту строку вверху вашего файла .m

 #define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

1) Вы должны установить условие, когда вы регистрируетесь для push-уведомления в IOS8.     добавьте этот код в приложение did finish launch.

if(IS_IOS_8_OR_LATER) {
    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];
 }

2) Затем добавьте эти методы для IOS8

#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

Затем вы вызовете метод делегирования уведомлений. надеюсь, это поможет вам!

Ответ 3

Параметры времени выполнения и старые параметры компилятора... если вы запускаете старый xcode (5.0 или более ранний)

    // changes of API in iOS 8.0
- (void) registerForPushNotification
{
    NSLog(@"registerForPushNotification");
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    {

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0 //__IPHONE_8_0 is not defined in old xcode (==0). Then use 80000

        NSLog(@"registerForPushNotification: For iOS >= 8.0");

        [[UIApplication sharedApplication] registerUserNotificationSettings:
            [UIUserNotificationSettings settingsForTypes:
                (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge)
                                              categories:nil]];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
#endif
    } else {
        NSLog(@"registerForPushNotification: For iOS < 8.0");
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
    }
}

Ответ 4

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    // For iOS 8

[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];

 [[UIApplication sharedApplication] registerForRemoteNotifications];
} 

else 
{
    // For iOS < 8
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}

После этого:

  • Удалите приложения, у которых нет Push-уведомлений.
  • Полностью выключите устройство и включите его.
  • Перейдите к настройкам и установите дату и время вперед в день.
  • Выключите устройство и верните его.
  • Установите приложения снова, и он будет запрашивать уведомление, как в первый раз, когда вы его установили.
  • Reset ваша дата/время снова, если вы не установили автоматически.

Это будет reset настройки уведомлений. Установите приложение, и все будет нормально работать:)

Ответ 5

Попробуйте это, если у вас есть как iOS 8, так и более старые версии:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    // For iOS 8
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
} else {
    // For iOS < 8
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}

С сайта Apple Development:

UIUserNotificationSettings

Объект UIUserNotificationSettings инкапсулирует типы уведомления, которые могут отображаться пользователю вашим приложением. Приложения, которые использовать видимые или звуковые сигналы в сочетании с локальным или нажатием уведомление должно регистрировать типы предупреждений, которые они используют. UIKit сопоставляет предоставленную вами информацию с предпочтениями пользователей определите, какие типы предупреждений разрешено использовать вашему приложению.

Используйте этот класс, чтобы инкапсулировать ваш первоначальный запрос на регистрацию и просмотреть результаты запроса. Создав экземпляр этого класса и указав предпочтительные параметры, вызовите метод registerUserNotificationSettings: класса UIApplication для регистрации этих параметров. После проверки вашего запроса на пользовательские настройки приложение доставляет результаты методу application:didRegisterUserNotificationSettings: своего делегата приложения. Объект, переданный этому методу, определяет типы уведомлений, которые разрешено использовать вашему приложению.

Помимо регистрации типов предупреждений приложений, вы также можете использовать этот класс для регистрации групп пользовательских действий для отображения в сочетании с локальными или push-уведомлениями. Пользовательские действия представляют собой непосредственные задачи, которые приложение может выполнять в ответ на уведомление. Вы определяете группы действий и связываете всю группу с заданным уведомлением. Когда отображается соответствующее предупреждение, система добавляет кнопки для каждого действия, которое вы указали. Когда пользователь нажимает кнопку для одного из действий, система пробуждает ваше приложение и вызывает метод application:handleActionWithIdentifier:forRemoteNotification:completionHandler: или application:handleActionWithIdentifier:forLocalNotification:completionHandler: своего делегата приложения. Используйте эти методы для выполнения запрошенного действия.

Ответ 6

Это очень просто:

Добавьте следующую строку в didFinishLaunchingWithOptions вашего проекта в xcode6

 [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
 [[UIApplication sharedApplication] registerForRemoteNotifications];

Ответ 7

The code below resolved:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
    UIUserNotificationType types;
    types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
    if (types & UIUserNotificationTypeAlert)
        pushEnabled=YES;
    else
        pushEnabled=NO;
}
else
{
    UIRemoteNotificationType types;
    types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
    if (types & UIRemoteNotificationTypeAlert)
       pushEnabled=YES;
    else
       pushEnabled=NO;

}

Ответ 8

Я попытался получить информацию о типе объекта настроек и выяснил, что свойство types в основном является битовой маской. Вот как вы можете извлечь информацию.

Мой пример в Swift и >= iOS 8.0, хотя.

    let settings = UIApplication.sharedApplication().currentUserNotificationSettings()

    if settings.types.rawValue & UIUserNotificationType.Alert.rawValue == UIUserNotificationType.Alert.rawValue
    {
       // can receive alert!
    }
    else
    {
       // if the user is not even able to receive alerts, show him a hint on how to reenable notifications in system settings
    }

    if settings.types.rawValue & UIUserNotificationType.Badge.rawValue == UIUserNotificationType.Badge.rawValue
    {
        // can receive badge!
    }
    if settings.types.rawValue & UIUserNotificationType.Sound.rawValue == UIUserNotificationType.Sound.rawValue
    {
        // can receive sound!
    }