Apple has introduced an exciting API in iOS 8 which facilitates one of the most awaited feature for Apps i.e. Interactive Push Notification. This enables your users to have access to some additional functionality even if they are outside your application. With this feature your users can type a reply, confirm a contact request, delete the message, and more without switching apps.
Although we included support for this feature just after iOS 8 came into picture, we receive a lot of queries on our support desk as to how App42 and this new feature can be bundled together to implement Interactive Push.
We have made a sample project and will walk you through the code step-by-step. Before getting into the implementation details, we must know some classes which are going to be used frequently.
Actions: An instance of UIUserNotificationAction represents a custom action that your App users can perform in response to a remote or a local notification. When a notification is delivered, it will be presented as a button and clicking on the button will launch your app (either in the foreground or background) giving you a chance to perform the indicated action.
Categories: An instance of UIUserNotificationCategory encapsulates information about custom actions that your app users can perform in response to a local or push notification. Every notification can be set to a specific category.
Settings: An instance of UIUserNotificationSettings encapsulates the types of notifications that can be displayed to the user by your app.
Implementation Diagram:
Getting Started:
Implementation of Interactive push notification is almost the same as that of standard push notification except that the in the former case the device needs to be registered for push notification and push payload needs to be created. This blog will only focus on registering the device for push notification, creating push payload and handling the actions performed.
This blog assumes you have previous knowledge of configuring and sending push notification using App42. If you are a new user please go through this tutorial first.
To get started, first download the Sample source code, unzip and open in xcode. Now open AppDelegate.m class from project navigator in xcode and search for the method createCategory. Let’s see how an action can be created:
//Creating Action 1
UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
action1.identifier = ACTION1_IDENTIFIER;
action1.title = @"Action1";
action1.activationMode = UIUserNotificationActivationModeBackground;
action1.authenticationRequired = NO;
action1.destructive = NO;
Let’s walk through the above code step-by-step:
Identifier: The string that will be used later to identify the action chosen by the App user.
Title: The localized string that will be used as the button title for the action in notification banner/alert.
ActivationMode: The mode(Background/Foreground) in which to run the app when the action is performed.
AuthenticationRequired: A Boolean value indicating whether the user must unlock the device before the action is performed. This is used only when activation mode is set to Background, ignored otherwise.
Destructive: A Boolean value indicating whether the action is destructive. Use this property to signal to the user whether the action causes destructive behavior to the user’s data or the app. When the value of this property is YES, the system displays the corresponding button differently to indicate that the action is destructive.
Same way we can create other different actions. Now created actions can be encapsulated in a category as follows:
//Creating Category
UIMutableUserNotificationCategory *interactiveCategory = [[UIMutableUserNotificationCategory alloc] init];
interactiveCategory.identifier = INTERACTIVE_CATEGORY;
//Setting actions to the category
[interactiveCategory setActions:@[action1,action2,action3] for Context:UIUserNotificationActionContextDefault];
[interactiveCategory setActions:@[action1,action2] forContext:UIUserNotificationActionContextMinimal];
Let’s walk through above code step-by-step:
Identifier: The name of the action group i.e. category which is needed to identify the category when any action is performed.
Default Context: The default context is for displaying the alert. In this context, the full UI is displayed for the notification’s alert. Maximum four custom actions can be specified in this context.
Minimal Context: The context is for displaying notification where space is minimal such as notification banner, lock screen notification view etc. In this context, a minimal UI is displayed for the notification’s alert. Maximum two custom actions can be specified in this context.
Next we can register for user notification settings by defining Notification type and settings as follows:
// 1. Notification types
UIUserNotificationType notificationType = UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound;
// 2. Notification Settings
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:notificationType categories:[NSSet setWithObject:[self createCategory]]];
//3. Register settings
[application registerUserNotificationSettings:notificationSettings];
First we defined the way the App will alert the user then we created notification settings using the notification type and the category returned by the createCategory method. Lastly we registered the configured settings for the application.
Sending Push Notification: Sending interactive push notification is similar to the standard push notification with the addition of an extra key-value pair in the payload.
IN the sample open ViewController.m class and go to sendPush method.
NSMutableDictionary *pushMessageDict = [NSMutableDictionary dictionary];
[pushMessageDict setObject:@"Hello Buddy !" forKey:@"alert"];
[pushMessageDict setObject:@"default" forKey:@"sound"];
[pushMessageDict setObject:@"increment" forKey:@"badge"];
[pushMessageDict setObject:INTERACTIVE_CATEGORY forKey:@"category"];
You can see the extra key highlighted in the above code snippet. If you have noticed earlier INTERACTIVE_CATEGORY is set as category identifier while creating category and the same we are passing here under “category” key in the payload.
Handling the Actions:
To handle the actions performed by the user we have to implement a delegate method in the AppDelagate Class as follows:
-(void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler
{
NSString *categoryIdentifier = [[userInfo objectForKey:@"aps"] objectForKey:@"category"];
if ([categoryIdentifier isEqualToString:INTERACTIVE_CATEGORY])
{
if ([identifier isEqualToString:ACTION1_IDENTIFIER])
{
NSLog(@"ACTION1 triggered");
}
else if ([identifier isEqualToString:ACTION2_IDENTIFIER])
{
NSLog(@"ACTION2 triggered");
}
else if ([identifier isEqualToString:ACTION3_IDENTIFIER])
{
NSLog(@"ACTION3 triggered");
}
else if ([identifier isEqualToString:ACTION4_IDENTIFIER])
{
NSLog(@"ACTION4 triggered");
}
}
completionHandler();
}
The delegate method comes with identifier of the action performed and the notification payload dictionary.
The categoryIdentifier from the push notification payload will help you know the actions category.
The next step is to compare the identifier that came in the above delegate method with action identifiers that were grouped in that category.
Once you have finished performing the specified action then you must call completionHandler at the end of the delegate method. Failure to execute the completion handler block at the end of your implementation will cause your app to be terminated.Apple ha introducido en API increíble en iOS 8 la cual facilita una de las funciones más esperadas para aplicaciones. Notificaciones Push Interactivas. Esto le permite a los usuarios de tener acceso a algunos funcionalidades adicionales incluso si están fuera de su aplicación. Con esta función sus usuarios pueden escribir una respuesta, confirmar una solicitud de contacto, borrar mensajes y más sin necesidad de cambiar de aplicaciones.
Aunque hemos incluido soporte para esta función justo después que iOS 8 salió al mercado, hemos recibido muchas consultas en nuestro servicio de asistencia, en como App42 y esta nueva función pueden agruparse para implementarse a Push Interactivas.
Hemos creado un proyecto de prueba y lo llevaremos a través de la codificación paso a paso. Antes de entrar a los detalles de implementación, debemos conocer algunas clases que se usaran de manera frecuente.
Actions: una instancia de UIUserNotificationAction representa una acción personalizada que los usuarios de su aplicación pueden realizar en respuesta a una notificación remota o local. Cuando una notificación es entregada, será presentada como un botón y un click en el botón pondrá en marcha su aplicación (ya sea en primer o segundo plano) dándole la oportunidad de indicar la acción.
Categories: una instancia de UIUserNotificationCategory encapsula información acerca de acciones personalizadas que los usuarios de su aplicación pueden realizar en respuesta a una notificación push local. Cada notificación puede ser ajustada a una categoría en específico.
Settings: Una instancia de UIUserNotificationSettings encapsula los tipos de notificaciones que pueden ser mostrados al usuario por su aplicación.
Diagrama de implementación:
Empezar :
La implementación de Notificaciones Push Interactivas es casi igual a la de notificaciones push estándar, excepto que en el primer caso el dispositivo requiere ser registrado para notificaciones push y push payload requiere ser creado. Este blog se enfoca en registrar el dispositivo para notificaciones push, la creación de payload push y gestión de las acciones realizadas.
En este blog se asume que posee conocimiento previo en configuración y envío de notificaciones push usando App42. Si es un nuevo usuario por favor primero vaya a este tutorial.
En este blog se asume que posee conocimiento previo en configuración y envío de notificaciones push usando App42. Si es un nuevo usuario por favor primero vaya a este tutorial.
//Creating Action 1
UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
action1.identifier = ACTION1_IDENTIFIER;
action1.title = @"Action1";
action1.activationMode = UIUserNotificationActivationModeBackground;
action1.authenticationRequired = NO;
action1.destructive = NO;
Ahora vayamos a través del código anterior paso a paso:
Identifier: La cadena que se utilizara después para identificar la acción escogida por el usuario de la aplicación
Title: la cadena localizada que será usada como el título del botón para la acción en notificaciones banner/alert.
ActivationMode: el modo (Primer plano/Segundo plano) en el cual ejecutar la aplicación cuando la acción es realizada.
AuthenticationRequired: Un valor booleano indica que si el usuario debe desbloquear el dispositivo antes que la acción sea realizada. Esto es usado solamente cuando el modo de activación es establecido en segundo plano, ignórelo de cualquier manera.
Destructive: un valor booleano indica si la acción es destructiva. Use esta propiedad para indicar al usuario si la acción causa un comportamiento destructivo a los datos del usuario en la aplicación. Cuando el valor en esta propiedad es SI, el sistema muestra el botón correspondiente de manera diferente para indicar que la acción es destructiva.
De la misma manera cuando creamos otras acciones diferentes. Ahora creamos acciones que pueden ser encapsuladas en categorías con a continuación:
//Creating Category
UIMutableUserNotificationCategory *interactiveCategory = [[UIMutableUserNotificationCategory alloc] init];
interactiveCategory.identifier = INTERACTIVE_CATEGORY;
//Setting actions to the category [interactiveCategory setActions:@[action1,action2,action3] forContext:UIUserNotificationActionContextDefault]; [interactiveCategory setActions:@[action1,action2] forContext:UIUserNotificationActionContextMinimal];
Hablemos del código anterior paso a paso:
Identifier: el nombre del grupo de acción, por ejemplo, la categoría en la que es necesario identificar la categoría cuando cada acción es realizada.
Default Context: el contexto por defecto se utiliza para mostrar la alerta. En este contexto, el UI completo es mostrado para la alerta de notificación. Máximo cuatro acciones personalizadas pueden ser especificas en el contexto.
Minimal Context: el contexto es para la visualización de la notificación donde el espacio es mínimo como un banner de notificación, notificación con pantalla bloqueada, etc. En este contexto, un UI mínimo es mostrado para alertas de notificaciones. Máximo dos acciones personalizables pueden ser especificadas en este contexto.
Ahora podemos registrar para ajustes de notificaciones de usuario definiendo el tipo de notificación y ajuste como a continuación:
// 1. Notification types
UIUserNotificationType notificationType = UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound;
// 2. Notification Settings
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:notificationType categories:[NSSet setWithObject:[self createCategory]]];
//3. Register settings
[application registerUserNotificationSettings:notificationSettings];
Primero definimos la manera como la aplicación alertara al usuario, luego creamos los ajustes de notificación usando el tipo de notificación y la categoría obtenida por el método createCategory. Por último registramos los ajustes configurados por la aplicación.
Enviar Notificaciones Push: enviar notificaciones push interactivas es similar a las notificaciones push estándar a diferencia de la adición de un extra par key-value en el payload.
IN the sample open ViewController.m class and go to sendPush method.
NSMutableDictionary *pushMessageDict = [NSMutableDictionary dictionary];
[pushMessageDict setObject:@"Hello Buddy !" forKey:@"alert"];
[pushMessageDict setObject:@"default" forKey:@"sound"];
[pushMessageDict setObject:@"increment" forKey:@"badge"];
[pushMessageDict setObject:INTERACTIVE_CATEGORY forKey:@"category"];
Puede ver la clave extra resaltada en grafico de códigos anterior. Si ya lo notó anteriormente INTERACTIVE_CATEGORY es establecido como identificador de categoría mientras la creación de categoría y el mismo es pasado como “Category” en el payload.
Manejo de acciones:
Para manejar las acciones realizadas por el usuario, tenemos que implementar un método delegado en AppDelegate Class como a continuación:
-(void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler
{
NSString *categoryIdentifier = [[userInfo objectForKey:@"aps"] objectForKey:@"category"];
if ([categoryIdentifier isEqualToString:INTERACTIVE_CATEGORY])
{
if ([identifier isEqualToString:ACTION1_IDENTIFIER])
{
NSLog(@"ACTION1 triggered");
}
else if ([identifier isEqualToString:ACTION2_IDENTIFIER])
{
NSLog(@"ACTION2 triggered");
}
else if ([identifier isEqualToString:ACTION3_IDENTIFIER])
{
NSLog(@"ACTION3 triggered");
}
else if ([identifier isEqualToString:ACTION4_IDENTIFIER])
{
NSLog(@"ACTION4 triggered");
}
}
completionHandler();
}
El método delegado viene con identificador de acción realizada y un diccionario de payload notificación.
El categoryIdentifier desde payload notificación push le ayudará a saber la categoría de acciones. El siguiente paso es comparar el identificador que viene con el método delegado anterior con identificadores de acción que fueron agrupados en la categoría.
Una vez haya terminado de realizar esta acción específica, entonces debe llamar completionHandler al final del método delegado. Una falla al ejecutar el bloque controlador de finalización al final de su implementación hará que su aplicación se cierre.
Leave A Reply