web-dev-qa-db-fra.com

iOS - L'alerte de notification push ne s'affiche pas lorsque l'application est en cours d'exécution

J'ai intégré les notifications Push dans mon application. Les utilisateurs recevront une notification Push pour rejoindre un groupe. Lorsque l'utilisateur clique sur Join, je dois gérer quelque chose dans le code. Et donc j'implémente:

- (void)application:(UIApplication *)application 
        didReceiveRemoteNotification:(NSDictionary *)userInfo

Cela fonctionne bien lorsque l'application n'est pas en cours d'exécution.
Lorsque l'application est en cours d'exécution, je ne vois aucun UIAlertView. Comment faire en sorte que mon application affiche l'alerte de notification Push afin que l'utilisateur puisse toujours décider de se joindre ou non?

34
Satyam

J'ai utilisé un code comme celui-ci dans mon délégué d'application pour imiter l'alerte de notification lorsque l'application était active. Vous devez implémenter la ou les méthodes de protocole UIAlertViewDelegate appropriées pour gérer ce qui se passe lorsque l'utilisateur appuie sur l'un des boutons.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {    
  UIApplicationState state = [application applicationState];
  if (state == UIApplicationStateActive) {
      NSString *cancelTitle = @"Close";
      NSString *showTitle = @"Show";
      NSString *message = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];
      UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Some title"
       message:message 
       delegate:self 
       cancelButtonTitle:cancelTitle 
       otherButtonTitles:showTitle, nil];
      [alertView show];
      [alertView release];
  } else {
    //Do stuff that you would do if the application was not active
  }
}
70
Jakob W

Pour tous ceux qui pourraient être intéressés, j'ai fini par créer une vue personnalisée qui ressemble à la bannière Push du système en haut, mais ajoute un bouton de fermeture (petit X bleu) et une option pour appuyer sur le message pour une action personnalisée. Il prend également en charge le cas de plusieurs notifications arrivées avant que l'utilisateur n'ait eu le temps de lire/rejeter les anciennes (sans limite de nombre pouvant s'empiler ...)

Lien vers GitHub: AGPushNote

L'utilisation est essentiellement en ligne:

[AGPushNoteView showWithNotificationMessage:@"John Doe sent you a message!"];

Et cela ressemble à ceci sur iOS7 (iOS6 a un aspect et une sensation iOS6 ...)

Example

17
Aviel Gross

Vous devez afficher l'alerte vous-même si vous le souhaitez. Il s'agit d'un comportement intentionnel tel que documenté ici http://developer.Apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html ci-dessous Liste 2-6

1
Kerni

Pour afficher une vue d'alerte lors de l'exécution de l'application, vous devez utiliser

-(void)application:(UIApplication *)application 
       didReceiveRemoteNotification:(NSDictionary *)userInfo {
}

et en accédant à la variable userInfo

1
Stark

seule cette fonction sera invoquée et vous devrez explicitement afficher l'alerte dans ce cas, aucune notification ne viendra si l'application est en cours d'exécution dans laquelle vous avez implémenté la notification.Placez le point d'arrêt là et gérez l'appel de notification lorsque la fonction est appelée et affichez votre personnalisé alerte là-bas.

1
Ballu

L'application recevra toujours le -application:didReceiveRemoteNotification message dans votre délégué d'application, mais vous devrez agir vous-même sur le message (c'est-à-dire que l'alerte ne s'affiche pas par défaut).

Le paramètre userInfo contient un objet avec la clé notificationType, que vous pouvez utiliser pour identifier le message Push.

0

Voici une version qui prend en charge UIAlertController

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
UIApplicationState state = [application applicationState];
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
if (state == UIApplicationStateActive) {

    UIAlertController * alert=   [UIAlertController
                                  alertControllerWithTitle:notification.alertTitle
                                  message:notification.alertBody
                                  preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* ok = [UIAlertAction
                         actionWithTitle:@"OK"
                         style:UIAlertActionStyleDefault
                         handler:^(UIAlertAction * action)
                         {
                             [alert dismissViewControllerAnimated:YES completion:nil];

                         }];

    [alert addAction:ok];

    [self.navigationController presentViewController:alert animated:YES completion:nil];

}

}

** Veuillez noter que mon application utilise self.navigationController dans App Delegate, connectez-vous à n'importe quel ViewController pour présenter (afficher) l'alerte **

0
Mike Zriel