iOS 9: notifiche con text input
Con iOS 9 le API per le notifiche actionable supportano finalmente il text input usato in Messaggi. Come configurare l'action, schedulare la notifica e gestire la risposta.
Versione italiana dell’articolo originale dell’11 giugno 2015; traduzione a cura del team.
Quando iOS 8 aveva aperto le API per le notifiche actionable, in molti eravamo rimasti delusi dal fatto che l’azione di text input usata in Messaggi non fosse disponibile. A quanto pare, con iOS 9 questa API è ora pubblica — anche se mentre scrivo la documentazione non la menziona. Dopo un po’ di scavi nel changelog di UIKit sono riuscito a costruire un sample che ne fa uso. Come con iOS 8, quest’anno l’NDA è più rilassato, ma vieta comunque di mostrare screenshot. In ogni caso, trovi il sample completo su GitHub. Vediamo passo per passo cosa è cambiato.
Richiedere il permesso
Prima di tutto dobbiamo chiedere il permesso all’utente per inviare notifiche. Partiamo costruendo una nuova UIMutableUserNotificationAction che, oltre alle proprietà principali della notifica, specifica anche il behavior desiderato:
let textAction = UIMutableUserNotificationAction()
textAction.identifier = "TEXT_ACTION"
textAction.title = "Reply"
textAction.activationMode = .Background
textAction.authenticationRequired = false
textAction.destructive = false
textAction.behavior = .TextInput
La proprietà behavior è una novità di iOS 9 e contiene l’enum UIUserNotificationActionBehavior:
enum UIUserNotificationActionBehavior : UInt {
case Default // the default action behavior
case TextInput // system provided action behavior, allows text input from the user
}
Tolto questo, il resto della configurazione non è cambiato molto rispetto a iOS 8:
let category = UIMutableUserNotificationCategory()
category.identifier = "CATEGORY_ID"
category.setActions([textAction], forContext: .Default)
category.setActions([textAction], forContext: .Minimal)
let categories = NSSet(object: category) as! Set<UIUserNotificationCategory>
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: categories)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
Una piccola differenza qui è dovuta alla nuova sintassi di Swift 2: al posto di
UIUserNotificationType.Alert | UIUserNotificationType.Sound | UIUserNotificationType.Badge
possiamo usare il ben più piacevole
[.Alert, .Sound, .Badge]
Fatto: una volta che l’utente concede il permesso possiamo schedulare una nuova local notification per fare un test:
static func scheduleNotification() {
let now: NSDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute], fromDate: NSDate())
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let date = cal.dateBySettingHour(now.hour, minute: now.minute + 1, second: 0, ofDate: NSDate(), options: NSCalendarOptions())
let reminder = UILocalNotification()
reminder.fireDate = date
reminder.alertBody = "You can now reply with text"
reminder.alertAction = "Cool"
reminder.soundName = "sound.aif"
reminder.category = "CATEGORY_ID"
UIApplication.sharedApplication().scheduleLocalNotification(reminder)
print("Firing at \(now.hour):\(now.minute+1)")
}
Ricevere la risposta
Quando l’utente attiva l’azione e scrive la risposta, il nostro AppDelegate viene chiamato tramite un nuovo metodo delegate introdotto in iOS 9:
func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forLocalNotification notification: UILocalNotification, withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
Il testo è memorizzato in responseInfo sotto la chiave UIUserNotificationActionResponseTypedTextKey:
let reply = responseInfo[UIUserNotificationActionResponseTypedTextKey]
Ed è tutto. Un’aggiunta benvenuta alle API: speriamo che presto tutte le principali messaging app la adottino. Trovi il sample completo qui. Una volta che hai lanciato l’app e schedulato la notifica, torna in home screen e potrai rispondere con del testo, che verrà mostrato nel view controller dell’app.