54 votes

didReceiveRemoteNotification en arrière-plan

Ce genre de question a été posé plusieurs fois, mais j'ai certains aspects spécifiques de la situation.

Quand mon application est active et que je reçois un message PUSH, je suis avec succès en mesure d'analyser la coutume de charge utile et de telle.

Toutefois, lorsque mon application est en arrière-plan et le PUSH arrive à l'utilisateur de cliquer sur l'onglet "Affichage/Ouvrir" bouton pour obtenir l' didReceiveRemoteNotification appelé et l' didFinishLaunchingWithOptions est appelé après que.

J'ai besoin d'avoir ma demande de décider si elles ont pour demander à l'utilisateur un UIAlert lorsque dans l'arrière-plan ou de supprimer le message push basé sur certains paramètres locaux.

Toute aide serait appréciée,

154voto

Bogatyr Points 12027

Vous application doit gérer tous les possible de notification push d'états de distribution:

  • Votre application vient d'être lancé

  • Votre application a été vient juste de l'arrière-plan au premier plan

  • Votre application est déjà en cours d'exécution dans le premier plan

Vous n'avez pas à choisir à la livraison à temps quel méthode de présentation est utilisée pour présenter la notification push, qui est codé dans la notification elle-même (en option alerte, numéro de badge, son). Mais depuis que vous avez sans doute sont dans le contrôle de l'application et la charge utile de la notification push, vous pouvez spécifier dans la charge utile de savoir si ou non il y a un affichage des alertes et des messages déjà présenté à l'utilisateur. Seulement dans le cas de l'application est déjà en cours d'exécution au premier plan, savez-vous que l'utilisateur n'a pas, il suffit de lancer votre application par le biais d'une alerte ou régulièrement à partir de l'écran d'accueil.

Vous pouvez dire si votre application a été vient d'être mis à l'avant-plan ou pas dans didReceiveRemoteNotification à l'aide de ce morceau de code:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if ( application.applicationState == UIApplicationStateActive )
        // app was already in the foreground
    else
        // app was just brought from background to foreground
    ...
}

8voto

Di Wu Points 4714

Une chose à garder à l'esprit, lorsque votre message push arrive sur l'iPhone de l'utilisateur et que celui-ci clique sur "annuler", à l'exception du numéro de badge de l'icône (ils seront pris en charge par le système d'exploitation), il n'y aurait aucun moyen de le faire. -l'application de fond pour connaître cet événement push et entreprendre d'autres actions.

2voto

morksinaanab Points 112

Mot d'avertissement

Je pense que votre application est la logique de baser comportement sur des données personnalisées dans votre notification push. Ce n'est pas ce que les notifications push sont destinés. Ce que vous devriez vous pouvez également faire sur didbecomeactive dans votre application, c'est juste demandez à votre serveur pour les données dont vous avez besoin et a été envoyer en tant que charge utile de toute façon, et s'en servir à la place de votre charge.

Parce que la documentation indique également qu'en tant que meilleure pratique. Parce que Apple ne garantit pas que votre notification push d'être reçu 100% de temps de toute façon.

Important: la Livraison des notifications est un "best-effort", pas de la garantie. Il n'est pas destiné à fournir des données pour votre application, uniquement pour signaler à l'utilisateur qu'il existe de nouvelles données disponibles.

Toutefois, si vous voulez avoir une idée de savoir si, par exemple, le badge a été changé sans compter sur un utilisateur à l'ouverture de l'application en cliquant sur le badge que vous pourriez quelque chose comme ceci:

A. vous ajoutez un (bon) numéro de badge à la charge de la notification envoyée par le serveur. Par exemple pourrait ressembler à ceci:

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9
    }
}

B. vous garder une trace de ce numéro de badge de manière persistante dans votre application, par exemple en les stockant dans NSUserDefaults.

Puis, en applicationDidBecomeActive peut comparer l' applicationIconBadgeNumber de la propriété de l' UIApplication avec vos précédemment stocké à l'insigne du comte et de voir si elle a été augmentée ou diminuée, et de faire quelques mises à jour sur cette base.

 - (void)applicationDidBecomeActive:(UIApplication *)application
    {

        NSNumber *badgecount = [[NSUserDefaults standardUserDefaults] objectForKey:@"badgecount"];
        if (!badgecount) badgecount = @(0);

        if ([UIApplication sharedApplication].applicationIconBadgeNumber != [badgecount integerValue]) {
            //store the new badge count
            badgecount = [NSNumber numberWithInteger:[UIApplication sharedApplication].applicationIconBadgeNumber];
            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            [defaults setObject:badgecount forKey:@"badgecount"];
            [defaults synchronize];

            // do some stuff here because it's different
        }

    }

0voto

Adam Freeman Points 86

Je suis curieux de savoir s'il est possible pour une application fonctionnant en arrière-plan de recevoir des informations sur les notifications push à d'autres applications. Je ne sais pas si cela est possible ou non ou uniquement pris en charge dans iOS 7.0. Je me rends compte que ce n'est pas tout à fait sur le sujet, mais chaque fois que je pose une nouvelle question, je n'ai reçu aucune réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X