iOS – Nécessité de distinguer UILocalNotification dans l'application: didReceiveLocalNotification:

Alors voici l'affaire … J'ai besoin d'un moyen de distinguer de quel état de l'application j'ai reçu un UILocalNotification .

Il y a un scénario que pour moi je ne comprends pas. C'est alors que l'application est en cours d'exécution au premier plan et que l'user arrête le centre de notifications (iOS 5), l'application s'appellera applicationWillResignActive: ce qui est parfaitement logique car elle ne sera pas active lorsque le centre de notifications sera affiché . Mais je soupçonne que aussi applicationDidEnterBackground: serait appelé juste après qu'il a résigné actif mais ce n'est pas le cas. Ainsi quand je reçois UILocalNotifications quand dans le centre de notification mon application essayera de les traiter dans l' application:didReceiveLocalNotification: mais quand j'appuie sur une notification de mon application qui est dans la list de centre de notification alors mon application traitera la même notification comme il l'a fait quand je l'ai reçu dans le centre de notification. Je ne peux donc traiter ces notifications que d'une seule façon, mais je devrais les gérer de deux manières.

Alors comment je distinguerais ces deux situations:

MODIFIER:

Je stocke toutes mes notifications avec un horodatage de 00 secondes. Donc à l'intérieur de l' application:didReceiveLocalNotification: Je pourrais vérifier l'heure actuelle [NSDate date] et voir si les secondes sont plus grandes que 00? Cela signifierait que ce n'est pas iOS qui a déclenché la notification, mais l'user du centre de notification. Cela dépend bien entendu du fait que les notifications seront effectivement livrées par iOS de cette manière opportune. Si iOS va livrer la notification à 01 secondes, ma logique va se casser. Mais pour le plaisir, j'ai juste fait une connection pour voir quand iOS délivre mes notifications et il semble que, à en juger par la sortie de la console, les notifications sont réellement délivrées à l'heure avec une précision de milliseconde (+/- 1). Bien sûr, vous ne pouvez pas comparer un périphérique de développement branché à l'ordinateur avec un scénario réel.

 2012-07-08 10:09:00.789 App[7535:707] -[AppDelegate application:didReceiveLocalNotification:] [Line 399] application:didReceiveLocalNotification: method running 2012-07-08 10:10:00.789 App[7535:707] -[AppDelegate application:didReceiveLocalNotification:] [Line 399] application:didReceiveLocalNotification: method running 2012-07-08 10:11:00.788 App[7535:707] -[AppDelegate application:didReceiveLocalNotification:] [Line 399] application:didReceiveLocalNotification: method running 2012-07-08 10:12:00.790 App[7535:707] -[AppDelegate application:didReceiveLocalNotification:] [Line 399] application:didReceiveLocalNotification: method running 2012-07-08 10:13:00.790 App[7535:707] -[AppDelegate application:didReceiveLocalNotification:] [Line 399] application:didReceiveLocalNotification: method running 2012-07-08 10:14:00.789 App[7535:707] -[AppDelegate application:didReceiveLocalNotification:] [Line 399] application:didReceiveLocalNotification: method running 2012-07-08 10:15:00.789 App[7535:707] -[AppDelegate application:didReceiveLocalNotification:] [Line 399] application:didReceiveLocalNotification: method running 

Pourriez-vous attendre de voir si votre état devient actif peu de time après?

Lorsque vous recevez une notification locale dans votre deuxième cas, votre application devient active dès que vous recevez le callback (puisque l'user choisit de revenir à votre application). Alors, que diriez-vous de stocker votre notification locale et agir sur elle (disons) 50ms plus tard; Si l'état de votre application est actif à ce moment, l'user a sélectionné votre application dans le centre de notifications.