Local notification: da iOS 9 ad iOS 10

Una subdola differenza nel comportamento delle notifiche locali fra iOS 9 e iOS 10 è come viene gestita una notifica la cui proprietà fireDate è impostata ad una data nel passato.

In iOS 9 semplicemente questa notifica veniva ignorata, mentre in iOS 10 viene lanciata immediatamente (probabilmente perché il sistema pensa che adesso sia il momento più vicino possibile alla data ormai passata).

Per cui, prima di impostare una fireDate ad un oggetto UILocalNotification è bene controllare che

1
[fireDate timeIntervalSinceNow] > 0
[fireDate timeIntervalSinceNow] > 0

ovvero che la data sia nel futuro.

Tip: aggiungere un intervallo di tempo ad un NSDate

Come si può aggiungere un giorno, un mese, un anno ad una data su in Objective-C?

Considerando la data di partenza, che può anche essere la data di oggi, ovvero [NSDate date], immaginiamo di voler aggiungere un mese. Core Foundation ci mette a disposizione la classe NSDateComponents la quale contiene la proprietà month (e non solo questa). Il metodo dateByAddingComponents:components:toDate:options permette di ottenere la data finale in maniera molto semplice.

Ecco il codice completo, usando la data di oggi come data di partenza:

1
2
3
NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *oneMonthFromNow = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:[NSDate date] options:0];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *oneMonthFromNow = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:[NSDate date] options:0];