2 votes

UILocationNotfication.fireDate dans le passé - bug ?

Selon Documents d'Apple sur UILocationNotification.fireDate :

Si la valeur spécifiée est nulle ou si elle correspond à une date passée, la notification est délivrée immédiatement.

Je ne constate pas ce comportement lorsque j'utilise une date dans le passé. Est-ce que c'est juste moi, ou d'autres personnes voient-elles cela également ?

Voici mon code :

NSMutableArray *notifications = [NSMutableArray array];
UILocalNotification* alarm = [[UILocalNotification alloc] init];
alarm.fireDate = [NSDate dateWithTimeIntervalSince1970:time(NULL)-5];
alarm.repeatInterval = 0;
alarm.soundName = @"alarm.caf";
alarm.alertBody = @"Test";
alarm.alertAction = @"Launch";
NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init];
[userInfo setValue:[NSNumber numberWithInt:10] forKey:@"PsID"];
alarm.userInfo = userInfo;
notifications = [NSArray arrayWithObject:alarm];
UIApplication *app = [UIApplication sharedApplication];
app.scheduledLocalNotifications = notifications;

Si je change la valeur de time(NULL)-5 en time(NULL)+5, je reçois la notification 5 secondes après l'exécution de ce code. Avec la valeur -5, je ne reçois jamais la notification.

Je sais que les bonnes questions doivent avoir une réponse définitive et que cette question pourrait faire l'objet de nombreuses réponses "moi aussi" Donc, ce que je cherche, c'est quelque chose d'officiel (citation/lien) d'Apple disant que c'est un comportement attendu, ou une version différente du code ci-dessus qui fonctionne comme les docs le disent.

C'est important pour mon application car, dans certains cas, je dois avertir l'utilisateur d'une alarme, même si elle s'est produite plus tôt dans la journée. Je suppose que je pourrais modifier mon code pour vérifier l'heure actuelle et toujours donner une valeur quelques secondes plus loin -- mais je ne suis pas sûr que "combien de secondes plus loin" soit vraiment sûr, et je voudrais que cela se produise dès que possible -- je préférerais aussi ne pas avoir ce hack s'il y a une meilleure façon d'obtenir un "comportement documenté". Mon code réel est similaire au précédent, mais j'affiche plusieurs notifications, certaines peuvent être dans le passé, d'autres plus tard dans la journée, d'autres demain et au-delà (ceci est pour une application de calendrier).

3voto

Myk Willis Points 6209

@eselk,

J'observe le même comportement que vous : une personne nouvellement créée UILocalNotification qui a un fireDate dans le passé ne tirera PAS s'il est installé en définissant l'option scheduledLocalNotifications propriété sur l'objet UIApplication.

Toutefois, si le même UILocalNotification est installé à l'aide de l'outil d'installation de UIApplication scheduleLocalNotification méthode, il se le feu immédiatement.

Il me semble qu'il s'agit d'un bug basé sur la documentation pour scheduledLocalNotifications qui stipule très clairement que :

...Lorsque vous définissez la propriété [scheduledLocalNotifications], UILocalNotification remplace toutes les notifications existantes en appelant cancelLocalNotification : et en appelant ensuite scheduleLocalNotification : pour chaque nouvelle notification.

Étant donné que cela ne semble pas être le cas, la solution consiste à appeler scheduleLocalNotification si la logique de votre application exige que les notifications programmées dans le passé soient présentées à l'utilisateur.

UILocalNotification *ln = [[UILocalNotification alloc]init];
[ln setFireDate:[NSDate dateWithTimeIntervalSinceNow:-2]]; // two seconds ago
// ...

// the following line works as expected - the notification fires immediately
[application scheduleLocalNotification:ln];  // Using this line works as expected

// using the following does NOT work as expected - the notification does not fire
//application.scheduledLocalNotifications = [NSArray arrayWithObject:ln];

(J'ai testé cela sur le simulateur iOS 6)

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