iOS 8 è dotato di una lunga lista di miglioramenti interessanti e in questo articolo voglio mostrarvi uno di quelli: le notifiche interattive con azioni associate.
Con questa nuova funzione gli utenti possono interagire direttamente con push o notifiche locali senza aprire l’applicazione. Un semplice esempio? Un app todo presenta un promemoria di un compito per l’utente attraverso una notifica locale. Possiamo ora facilmente aggiungere un pulsante per il messaggio di notifica per contrassegnare l’attività come eseguita direttamente all’interno della notifica di avviso.
LET’S CODE
Per mostrare come funziona ho implementato una semplice applicazione contatore che mostra un messaggio ogni 60 secondi, chiedendo all’utente di incrementare o decrementare il valore del contatore. Si tratta di una applicazione utile, non è vero?
Per farla semplice, questo progetto funziona solo con le notifiche locali, ma tutti questi passaggi possono essere facilmente adattati alle notifiche remote. Da ora in poi, tenere a mente che ogni volta che parlo di notifiche mi riferisco sia a livello locale che alle notifiche push.
Con iOS 8 si aggiungono nuove informazioni alle notifiche:
- Azioni: descrivono le azioni che l’utente può eseguire per interagire con il messaggio di notifica. Esse sono presentate come pulsanti. Definiti dalla classe UIUserNotificationAction.
- Categorie: raggruppiamo le azioni in categorie e per ogni notifica possiamo impostare una specifica categoria. Definite dalla classe UIUserNotificationCategory.
- Impostazioni: devono essere registrate con l’applicazione e contengono tutte le categorie che creiamo. Le impostazioni vengono definite dalla classe UIUserNotificationSettings.
Per l’applicazione contatore abbiamo bisogno di tre azioni:
Incremento (aggiungere 1), Decremento (sottrarre 1) e Reset (impostare il contatore a 0). Per creare il UIUserNotificationAction è necessario questo codice:
[code lang=”obj-c”]
// increment Action
UIMutableUserNotificationAction *incrementAction= [[UIMutableUserNotificationAction alloc] init];
incrementAction.identifier = @"INCREMENT_ACTION"; // l’id passato quando l’utente seleziona l’azione
incrementAction.title = NSLocalizedString(@"Add +1",nil); // Il titolo mostrato all’utente
incrementAction.activationMode = UIUserNotificationActivationModeBackground; // Scegli se l’applicazione apparirà in background o in primo piano quando si seleziona l’azione
incrementAction.destructive = NO; // Se YES, l’azione sarà in rosso
incrementAction.authenticationRequired = YES; // Se è richiesta l’autenticazione
// decrement Action
UIMutableUserNotificationAction *decrementAction= [[UIMutableUserNotificationAction alloc] init];
decrementAction.identifier = @"DECREMENT_ACTION"; // l’id passato quando l’utente seleziona l’azione
decrementAction.title = NSLocalizedString(@"Sub -1",nil); // Il titolo mostrato all’utente
decrementAction.activationMode = UIUserNotificationActivationModeBackground; // Scegli se l’applicazione apparirà in background o in primo piano quando si seleziona l’azione
decrementAction.destructive = NO; // Se YES, l’azione sarà in rosso
decrementAction.authenticationRequired = YES; // Se è richiesta l’autenticazione
// reset Action
UIMutableUserNotificationAction *resetAction= [[UIMutableUserNotificationAction alloc] init];
resetAction.identifier = @"INCREMENT_ACTION"; // l’id passato quando l’utente seleziona l’azione
resetAction.title = NSLocalizedString(@"Add +1",nil); // Il titolo mostrato all’utente
resetAction.activationMode = UIUserNotificationActivationModeForeground; // Scegli se l’applicazione apparirà in background o in primo piano quando si seleziona l’azione
resetAction.destructive = YES; // Se YES, l’azione sarà in rosso
//NON USATA: resetAction.authenticationRequired = NO; // Se è richiesta l’autenticazione
[/code]
Adesso che abbiamo la nostra lista di azioni dobbiamo racchiuderle in una UIUserNotificationCategory e conservarle in UIUserNotificationSettings.
[code lang=”obj-c”]
UIMutableUserNotificationCategory *counterCategory= UIMutableUserNotificationCategory alloc] init];
counterCategory.identifier = @"COUNTER_CATEGORY"; // Identificatore passato nel payload
[counterCategory setActions:@[incrementAction, decrementAction, resetAction] forContext:UIUserNotificationContextDefault]; // Il contesto determina la quantità di azioni presentate (guarda la documentazione)
//ALTERNATIVA:
// [counterCategory setActions:@[incrementAction, decrementAction] forContext:UIUserNotificationContextMinimal];</pre>
[/code]
Il contex minimal si riferisce alla notifica a banner, la view per la schemata di sblocco ed il centro notifiche. In questo caso le azioni presentate sono al massimo due. Mentre il contesto di default è disponibile solo quando l’utente accetta di mostrare le notifiche per la vostra applicazione, come avvisi, in questo caso otteniamo tutte le azioni che abbiamo impostato.
[img_3banners]
A questo punto possiamo costruire le impostazioni utilizzando questo codice:
[code lang=”obj-c”]
NSSet *categories = [NSSet setWithObjects:category];
NSUInteger types = UIUserNotificationTypeAlert | UIUserNotificationTypeSound; // Aggiungi badge, sound, o alerts qui
UIUserNotificationSettings *settings = [UIUSerNotificationSettings settingsForTypes:types categories:counterCategory]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[/code]
Scegliamo il tipo di notifica in base alle esigenze applicative e costruiamo le impostazioni di questi tipi e di tutte le categorie create (nel nostro caso solo una).
L’ultima operazione è quella di chiamare il metodo registerUserNotificationSettings sull’applicazione.
Quando questo codice viene chiamato per la prima volta, all’utente verrà richiesto, con un avviso, che intendiamo inviargli le notifiche, esattamente come eravamo abituati a con le notifiche in iOS 7.
Programma le notifiche
Il codice che utilizziamo per programmare le notifiche interattive è esattamente lo stesso che scriviamo per le notifiche standard con l’aggiunta di una proprietà per puntare alla categoria:
[code lang=”obj-c”]
UILocalNotification *notifica = [[UILocalNotification alloc] init];
[notifica setFireDate:[NSDate date]];
[notifica setCategory:@"COUNTER_CATEGORY"];
[notifica setTimeZone:[NSTimeZone defaultTimeZone]];
[notifica setRepeatInterval: kCFCalendarUnitMinute];
[notifica setAlertBody:@"Ehy! Aggiorna il contatore!"];
[[UIApplication sharedApplication] scheduleLocalNotification:notifica];
[/code]
oppure le notifiche remote:
[code lang=”obj-c”]
{
"aps":{
"alert":"Questa è una notifica remota",
…
"category":"COUNTER_CATEGORY"
}
}
[/code]
Si noti che la proprietà categoria memorizza lo stesso valore che abbiamo impostato in precedenza come identificatore di categoria (‘COUNTER_CATEGORY’). Così ora siamo sicuri che, quando viene visualizzata questa notifica presenterà le azioni memorizzate nella categoria con id COUNTER_CATEGORY.
Gestire le azioni
Puoi adesso gestire le azioni nell’app delegate implementando i metodi di protocollo UIApplicationDelegate: application:handleActionWithIdentifier:forRemoteNotification:completionHandler: per le notifiche remote e application:handleActionWithIdentifier:forLocalNotification:completionHandler: per le notifiche locali.
[code lang=”obj-c”]
if (notification.category isEqualToString: @"COUNTER_CATEGORY") {
// counter = [Counter alloc]init];
if ([identifier isEqualToString:@"INCREMENT_ACTION"]) {
// …counter++;
} else if ([identifier isEqualToString:@"DECREMENT_ACTION"]) {
// …counter–;
} else if ([identifier isEqualToString:@"RESET_ACTION"]) {
// …counter = 0;
}
if (completionHandler) {
completionHandler(); //RICHIAMARE sempre alla chiusura.
}
[/code]
La classe Counter è una classe (di esempio) che ho costruito come modello solo per gestire il valore corrente del contatore come potete vedere abbiamo appena incremento, decremento o azzerato il contatore a seconda dell’azione che l’utente ha selezionato
Nota: questo è un tutorial di media difficoltà quindi non viene costruito un progetto intero indicando ogni singolo passaggio, tuttavia viene mostrato il codice e la logica nella sua interezza.
Questo è tutto. È ora possibile installare e lanciare l’applicazione sul vostro dispositivo ed essere infastiditi ogni 60 secondi da questo straordinario software!