web-dev-qa-db-fra.com

gestion des notifications push

Je lis les documents d'Apple sur

Gestion des notifications locales et distantes

et il me semble que les déclarations sont contradictoires. Quelqu'un peut-il éclaircir ces points de confusion? Parlons strictement de la notification à distance (versus locale) pour l'instant.

Les documents indiquent que si le bouton d'action de la notification est enfoncé, il appelle application: didFinishLaunchingWithOptions et transmet la charge utile de la notification. Plus tard, il indique que si l'application s'exécute au premier plan, elle envoie la notification via l'application: didReceiveRemoteNotification :. Cela implique pour moi que lorsque l'application est en arrière-plan ou ne fonctionne pas, l'application: didFinishLaunchingWithOptions est appelée. Sinon, l'application: didReceiveRemoteNotification: est appelée.

Plus tard, une note iOS dit ce qui suit:

"iOS Remarque: dans iOS, vous pouvez déterminer si une application est lancée lorsque l'utilisateur a appuyé sur le bouton d'action ou si la notification a été envoyée à l'application déjà en cours d'exécution en examinant l'état de l'application. Dans l'implémentation de l'application par le délégué : didReceiveRemoteNotification: ou application: didReceiveLocalNotification: méthode, obtenez la valeur de la propriété applicationState et évaluez-la. Si la valeur est UIApplicationStateInactive, l'utilisateur a appuyé sur le bouton d'action; si la valeur est UIApplicationStateActive, l'application était au premier plan lorsqu'elle a reçu la notification. "

Cela implique pour moi que l'application: didReceiveRemoteNotification: est appelée à la fois lorsque l'application est déjà au premier plan et si l'utilisateur appuie sur le bouton d'action (ou fait glisser le curseur d'action dans iOS 5) pour mettre en avant/lancer l'application.

La source de ma confusion pourrait être avec la première partie où les documents impliquent que la charge utile de notification est envoyée avec l'application: didFinishLaunchingWithOptions: méthode ou avec une mauvaise compréhension de ce qu'est une application "en cours d'exécution" (une application en arrière-plan est-elle considérée comme "en cours d'exécution?") . La documentation de l'application: didReceiveRemoteNotification: indique qu'elle est appelée pour les applications "en cours d'exécution".

Donc, pour résumer, puis-je obtenir des éclaircissements sur:

1) L'application est-elle: didReceiveRemoteNotification: toujours appelée lorsque l'application est mise en avant-plan ou lorsque l'utilisateur choisit "d'agir" sur la notification? Sinon, comment pouvons-nous donner un sens à la note iOS sur la détermination de l'état de l'application active ou inactive?

2) Une application en arrière-plan "est-elle en cours d'exécution", au moins dans le sens de la demande de documentation des documents: didReceiveRemoteNotification est-elle appelée pour exécuter des applications?

3) Pour terminer, une application en arrière-plan est-elle UIApplicationStateInactive ou Active?

38
Joey

Le libellé ici est déroutant, en particulier autour de l'arrière-plan de Word.

Lorsque l'application n'est vraiment pas chargée en mémoire (par exemple, lorsque vous la lancez, l'écran de démarrage apparaît, etc.), alors l'application: didFinishLaunchingWithOptions est appelée et vous pouvez obtenir la notification Push comme suit:

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if(remoteNotif)
{
    //Handle remote notification
}

Si l'application est chargée en mémoire et est ACTIVE (par exemple, l'application est actuellement ouverte sur l'appareil), alors seulement application:didReceiveRemoteNotification: est appelé.

Si l'application est chargée en mémoire mais n'est pas ACTIVE et PAS DE CONTEXTE (par exemple, vous avez lancé l'application, puis appuyé sur le bouton d'accueil et attendu 10 secondes), puis vous cliquez sur le bouton d'action sur une notification Push, seule didReceiveRemoteNotification est appelée .

Vous pouvez capturer ce cas comme suit:

-(void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if([app applicationState] == UIApplicationStateInactive)
    {
        //If the application state was inactive, this means the user pressed an action button
        // from a notification. 

    //Handle notification
    }
}
92
ch3rryc0ke

Selon le scénario iOS 9.1, j'ai testé la notification Push en mode Kill où mon application ne s'exécute dans aucun mode à ce moment-là si je tape sur la notification Push que le système appellera en premier,

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

//your code execution will here.

}

Et le deuxième appel de méthode sera,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//Your initial code execution.

}

Ce scénario que j'ai testé dans mon application.

2
Gautam Sareriya