web-dev-qa-db-fra.com

le périphérique compatible iOS 8 ne reçoit pas de notifications Push après la mise à jour du code

J'ai récemment mis à niveau l'un de mes iphones de test vers iOS 8, puis le code d'enregistrement Push a été mis à niveau comme ci-dessous (à l'aide de 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)];


    }
}

Malgré cette mise à niveau et le fait que [[UIApplication sharedApplication] currentUserNotificationSettings] indique que le Push est activé pour le périphérique, je ne reçois pas de notifications Push. 

J'utilise Parse et je fais tout ce qui est écrit dans le livre en ce qui les concerne ( https://parse.com/tutorials/ios-Push-notifications ).

Est-ce que quelqu'un connaît le même problème? Y a-t-il autre chose qui me manque?

31
Zigglzworth

Le mode d’enregistrement des notifications Push a été modifié dans iOS 8:

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

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

Si vous souhaitez vérifier si les notifications Push sont activées ou non, utilisez le code ci-dessous:

- (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

Le code ci-dessus ne fonctionnera que sur Xcode 6+ ...

70
pankaj

Ajoutez cette ligne en haut de votre fichier .m

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

1) Vous devez mettre la condition lorsque vous vous inscrivez à la notification Push dans IOS8. ajoutez ce code dans l'application 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) Ajoutez ensuite ces méthodes pour 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

Ensuite, votre méthode de délégué de notification sera appelée. J'espère que ceci vous aidera !!!

12
Nits007ak

Runtime et anciennes options sûres du compilateur ... si vous utilisez un ancien xcode (5.0 ou antérieur)

    // 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
karim
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)];
}

Après ça:

  1. Supprimez les applications qui ne reçoivent plus de notifications Push de l'appareil.
  2. Éteignez complètement l'appareil, puis rallumez-le.
  3. Accédez aux paramètres et définissez la date et l'heure de la journée
  4. Éteignez et rallumez l'appareil.
  5. Installez les applications à nouveau et il vous demandera une notification comme lors de la première installation.
  6. Réinitialisez votre date/heure si ce n’est pas réglé automatiquement.

Cela réinitialisera les paramètres de notification. Réinstallez l'application et tout fonctionnera bien :)

4
Muzammil

Essayez ceci si vous avez à la fois iOS 8 et versions antérieures:

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)];
}

Sur le site de développement d'Apple:

UIUserNotificationSettings

Un objet UIUserNotificationSettings encapsule les types de notifications pouvant être affichées à l'utilisateur par votre application. Des applications qui utiliser des alertes visibles ou sonores en conjonction avec un Push local ou Push notification doit enregistrer les types d'alertes qu'ils utilisent. UIKit met en corrélation les informations que vous fournissez avec les préférences de l'utilisateur avec déterminer les types d'alertes que votre application est autorisée à utiliser.

Utilisez cette classe pour encapsuler votre demande d'enregistrement initiale et pour afficher les résultats de la demande. Après avoir créé une instance de cette classe et spécifié vos paramètres préférés, appelez la méthode registerUserNotificationSettings: de la classe UIApplication pour enregistrer ces paramètres. Après avoir vérifié votre demande par rapport aux préférences de l'utilisateur, l'application envoie les résultats à la méthode application:didRegisterUserNotificationSettings: de son délégué d'application. L'objet transmis à cette méthode spécifie les types de notifications que votre application est autorisée à utiliser.

Outre l'enregistrement des types d'alerte de votre application, vous pouvez également utiliser cette classe pour enregistrer des groupes d'actions personnalisées à afficher en association avec des notifications locales ou Push. Les actions personnalisées représentent des tâches immédiates que votre application peut effectuer en réponse à la notification. Vous définissez des groupes d’actions et associez le groupe entier à une notification donnée. Lorsque l'alerte correspondante est affichée, le système ajoute des boutons pour chaque action spécifiée. Lorsque l'utilisateur appuie sur le bouton de l'une des actions, le système réveille votre application et appelle la méthode application:handleActionWithIdentifier:forRemoteNotification:completionHandler: ou application:handleActionWithIdentifier:forLocalNotification:completionHandler: de son délégué d'application. Utilisez ces méthodes pour effectuer l'action demandée.

1
Sujith Thankachan

C'est très simple:

Ajouter la ligne suivante dans didFinishLaunchingWithOptions de votre projet dans xcode6

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

J'ai essayé d'obtenir les informations de type de l'objet settings et j'ai découvert que la propriété types est fondamentalement un masque de bits. Voici comment vous pouvez extraire les informations.

Mon exemple est dans Swift et> = iOS 8.0 cependant.

    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!
    }
0
Raphael
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;

}
0
Adelmo Júnior