Comment capter toutes les Notifications iOS Push avec différentes actions de l'utilisateur, y compris l'icône de l'application tap on

selon le guide de la pomme:

" suite à la notification présentée, l'utilisateur tape le bouton d'action de l'alerte ou tape (ou clique) sur l'icône de l'application. Si le bouton action est pointé (sur un périphérique tournant iOS), le système lance l'application et l'application appelle l'application de son délégué: didFinishLaunchingWithOptions: method (si implémentée); il passe dans la charge de notification (pour les notifications à distance) ou l'objet local-notification (pour les notifications locales).

si l'icône de l'application est tapotée sur un périphérique exécutant iOS, l'application appelle la même méthode, mais ne fournit aucune information sur la notification . Si L'icône de l'application est cliquée sur un ordinateur qui exécute Mac OS X, l'application appelle applicationDidFinishLaunching: méthode dans laquelle le délégué peut obtenir la charge utile de notification à distance."

ma question Est Supposons que l'utilisateur obtienne 3-4 notifications Push de fournisseur et tous sont stockés dans le centre de notification d'apple. Si l'utilisateur est connecté à l'alerte de notification, il / elle peut facilement obtenir les données de notification dans l'application. Mais si l'utilisateur a tapé icône de l'application sur iPhone, comment obtenir toutes les données relatives de toutes les notifications précédentes.

Merci d'avance!

25
demandé sur Bartłomiej Semańczyk 2012-07-02 13:03:35

5 réponses

vous ne pouvez pas, vous recevrez seulement des informations sur la notification qui a été utilisée pour ouvrir votre application.

Donc, si un utilisateur ouvre votre application et votre application a des notifications, vous ne serez pas en mesure de les récupérer dans votre application.

une solution pourrait être de garder la trace de la notification sur un serveur et de gérer cela dans l'application. Ainsi le serveur garde la trace sur laquelle la notification a été lue. C'est la façon dont Facebook fait.

39
répondu rckoenes 2013-05-10 08:49:35

pour le faire correctement, certaines conditions doivent être remplies:

votre serveur sait ce que votre application a vu et quelles notifications il pourrait envoyer à nouveau.

considérons seulement les notifications à distance. Il y a trois états d'app:

  • premier plan :

    • une notification s'affiche sans action de l'utilisateur:

      func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
          //handle your notification
      }
      

    vous pouvez afficher la bannière en utilisant la bibliothèque de tiers: BSForegroundNotification

  • arrière-plan

    • la notification apparaît à l'écran. (notez que définir content-available=1 dans une notification push peut conduire à le dernier message push étant visible une fois que l'icône de l'application est pressée, comme didReceive... est appelé).

      //nothing is called in the app, but app icon badge changes
      // OR - if the notification contains the field content-available set to 1 - 
      func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
          //handle your notification
      } 
      
    • utilisateur d'appuyer sur la notification

      func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
          //handle your notification
      }           
      
    • à l'utilisateur de prendre action de notification

      func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification's action
      }
      

      ou

      func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification's action response info
      }
      
    • de l'utilisateur appuyez sur l'icône de l'application

      func applicationDidBecomeActive(application: UIApplication) {
          //fetch pending notifications from server
      }
      
  • PAS DE COURSE DU TOUT

    • la notification apparaît à l'écran.

      //nothing is called in the app, but app icon badge changes
      
    • utilisateur d'appuyer sur la notification

      func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
          if let userInfo = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [NSObject: AnyObject] {
              //handle your notification
          }
      }
      
    • à l'utilisateur de prendre action de notification

      func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification's action
      }
      

      ou

      func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification's action response info
      }
      
    • de l'utilisateur appuyez sur l'icône de l'application

      func applicationDidBecomeActive(application: UIApplication) {
          //fetch pending notifications from server
      }
      

Comment traiter la notification?

  1. let notification = WLNotification(userInfo: userInfo)

    dans WLNotification n'oubliez pas de tenir à jour l'état de la demande lorsque vous recevez la notification. À l'avenir, vous pourriez en avoir besoin pour savoir d'où vient cette notification. de.

  2. WLNetworkClient.sharedClient().notificationForIdentifier(notification.identifier)

    Récupérer à partir du serveur de détails au sujet de cette notification, et dans le même temps, laissez-lui savoir que vous avez VRAIMENT obtenir la notification, et effectuée sur les données de l'utilisateur.

Comment récupérer toutes les notifications en attente?

WLNetworkClient.sharedClient().pendingNotificationsWithCompletionBlock(nil)

Fetch toutes les notifications que vous avez manqué. en d'autres termes, récupérez ceux qui n'ont pas été marqués dans le serveur tel que vous l'avez reçu.

Lire Limitations d'Apple Push Notifications .

voir les questions connexes:

15
répondu Bartłomiej Semańczyk 2017-05-23 10:31:16

j'ai eu le même problème: si l'utilisateur clique sur push bannière qu'il obtient info de pousser dans l'application, s'il clique sur l'icône de l'application, il n'a pas l'obtenir. Vous pouvez gérer un dérivé de celui-ci, mais avec quelques limites seulement. Exemple, si vous souhaitez avoir un numéro de badge de push, vous pouvez le faire: (Push -> icône de l'Application -> App badge sur l'icône -> votre var)

in AppDelegate

- (void)applicationWillEnterForeground:(UIApplication *)application
{ 
    newMessages = application.applicationIconBadgeNumber;
}
3
répondu gerram 2015-03-05 03:09:45

conceptuellement lorsque l'application est chargée avec la vue d'alerte de clic présentée pour la notification Push, que l'application est lancée avec la méthode de délégué didReceiveLocalNotification si votre application est en arrière-plan. À ce point applicationDidFinishLaunching méthode de délégué n'est pas appelé.

lorsque votre application n'est pas en arrière-plan, la méthode applicationDidFinishLaunching s'affichera en cliquant sur alerte pour la notification Push.

J'espère que ceci éclaircira votre compréhension entre ces deux méthodes de délégation.

1
répondu Janak Nirmal 2012-07-02 09:12:06

vous pouvez utiliser ce code:

 NSArray *pendingNotifications = [[[UIApplication sharedApplication] scheduledLocalNotifications] sortedArrayUsingComparator:^(id obj1, id obj2)                       {

        if ([obj1 isKindOfClass:[UILocalNotification class]] && [obj2 isKindOfClass:[UILocalNotification class]])
        {
            UILocalNotification *notif1 = (UILocalNotification *)obj1;
            UILocalNotification *notif2 = (UILocalNotification *)obj2;
            return [notif1.fireDate compare:notif2.fireDate];
        }

        return NSOrderedSame;
 }];

 // if there are any pending notifications -> adjust their badge number
 if (pendingNotifications.count != 0)
 {
     //do something
 }
-2
répondu dieuvn3b 2015-09-01 06:19:37