Incorporación de notificaciones push a la aplicación Xamarin.iOS

Información general

En este tutorial, agregará notificaciones de inserción al proyecto de inicio rápido de Xamarin.iOS para que cada vez que se envíe una notificación de inserción al dispositivo, se inserte un registro.

Si no usa el proyecto de servidor de inicio rápido descargado, necesitará el paquete de extensión de la notificación de inserción. Vea Trabajar con el SDK de servidor de back-end de .NET para Azure Mobile Apps para obtener más información.

Prerrequisitos

Registro de la aplicación para notificaciones de inserción en el portal para desarrolladores de Apple

Configuración de aplicaciones móviles para enviar notificaciones push

  1. En el equipo Mac, inicie Acceso a llaves. En la barra de navegación izquierda, en Categoría, abra Mis certificados. Busque el certificado SSL que descargó en la sección anterior y muestre su contenido. Seleccione solo el certificado (no seleccione la clave privada). A continuación, expórtelo.
  2. En Azure Portal, seleccione Examinar todo>App Services. A continuación, seleccione el back-end de Mobile Apps.
  3. En Configuración, seleccione App Service Push. A continuación, seleccione el nombre del centro de notificaciones.
  4. Vaya a Apple Push Notification Services>Upload Certificado. Upload el archivo .p12, seleccionando el modo correcto (en función de si el certificado SSL de cliente anterior es de producción o espacio aislado). Guarde los cambios.

El servicio ahora está configurado para trabajar con las notificaciones push en iOS.

Actualización del proyecto de servidor para enviar notificaciones push

En esta sección, se actualiza el código del proyecto de back-end de Mobile Apps existente con el objetivo de enviar una notificación push cada vez que se agrega un nuevo elemento. Este proceso funciona con la característica de plantillas de Azure Notification Hubs, que permite inserciones multiplataforma. Los diversos clientes se registran para recibir notificaciones push mediante plantillas, y una solo notificación push puede acceder a todas las plataformas de cliente.

Elija uno de los procedimientos siguientes que coincida con el tipo de proyecto de back-end, ya sea back-end de .NET oNode.js back-end.

Proyecto de back-end de .NET

  1. En Visual Studio, haga clic con el botón derecho en el proyecto de servidor. A continuación, seleccione Administrar paquetes NuGet. Busque Microsoft.Azure.NotificationHubs y, después, seleccione Instalar. Este proceso instala la biblioteca de Notification Hubs para enviar notificaciones desde el back-end.

  2. En el proyecto de servidor, abra ControllersTodoItemController.cs>. Luego, agregue las siguientes instrucciones using:

    using System.Collections.Generic;
    using Microsoft.Azure.NotificationHubs;
    using Microsoft.Azure.Mobile.Server.Config;
    
  3. En el método PostTodoItem, agregue el código siguiente después de la llamada a InsertAsync:

    // Get the settings for the server project.
    HttpConfiguration config = this.Configuration;
    MobileAppSettingsDictionary settings =
        this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
    
    // Get the Notification Hubs credentials for the mobile app.
    string notificationHubName = settings.NotificationHubName;
    string notificationHubConnection = settings
        .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;
    
    // Create a new Notification Hub client.
    NotificationHubClient hub = NotificationHubClient
    .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
    
    // Send the message so that all template registrations that contain "messageParam"
    // receive the notifications. This includes APNS, GCM, WNS, and MPNS template registrations.
    Dictionary<string,string> templateParams = new Dictionary<string,string>();
    templateParams["messageParam"] = item.Text + " was added to the list.";
    
    try
    {
        // Send the push notification and log the results.
        var result = await hub.SendTemplateNotificationAsync(templateParams);
    
        // Write the success result to the logs.
        config.Services.GetTraceWriter().Info(result.State.ToString());
    }
    catch (System.Exception ex)
    {
        // Write the failure result to the logs.
        config.Services.GetTraceWriter()
            .Error(ex.Message, null, "Push.SendAsync Error");
    }
    

    Este proceso envía una notificación de plantilla que contiene el archivo item.text cuando se inserta un nuevo elemento.

  4. Vuelva a publicar el proyecto de servidor.

Proyecto de back-end de Node.js

  1. Configure el proyecto de back-end.

  2. Reemplace el código existente en el archivo todoitem.js por el siguiente:

    var azureMobileApps = require('azure-mobile-apps'),
    promises = require('azure-mobile-apps/src/utilities/promises'),
    logger = require('azure-mobile-apps/src/logger');
    
    var table = azureMobileApps.table();
    
    table.insert(function (context) {
    // For more information about the Notification Hubs JavaScript SDK,
    // see https://aka.ms/nodejshubs.
    logger.info('Running TodoItem.insert');
    
    // Define the template payload.
    var payload = '{"messageParam": "' + context.item.text + '" }';  
    
    // Execute the insert. The insert returns the results as a promise.
    // Do the push as a post-execute action within the promise flow.
    return context.execute()
        .then(function (results) {
            // Only do the push if configured.
            if (context.push) {
                // Send a template notification.
                context.push.send(null, payload, function (error) {
                    if (error) {
                        logger.error('Error while sending push notification: ', error);
                    } else {
                        logger.info('Push notification sent successfully!');
                    }
                });
            }
            // Don't forget to return the results from the context.execute().
            return results;
        })
        .catch(function (error) {
            logger.error('Error while running context.execute: ', error);
        });
    });
    
    module.exports = table;  
    

    Este proceso envía una notificación de plantilla que contiene el archivo item.text cuando se inserta un nuevo elemento.

  3. Cuando edite el archivo en el equipo local, vuelva a publicar el proyecto de servidor.

Configuración del proyecto de Xamarin.iOS

Configuración del proyecto de iOS en Xamarin Studio

  1. En Xamarin.Studio, abra Info.plist y actualice el identificador de lote con el identificador de lote que creó anteriormente con el nuevo identificador de aplicación.

  2. Desplácese hacia abajo hasta Background Modes (Modos en segundo plano). Active la casilla Enable Background Modes (Habilitar modos en segundo plano) y la casilla Remote notifications (Notificaciones remotas).

  3. Haga doble clic en el proyecto en el Panel de soluciones para abrir las opciones de proyecto.

  4. En Build (Compilar), elija iOS Bundle Signing (Registro de agrupaciones de trabajos iOS) y seleccione la identidad y el perfil de aprovisionamiento correspondientes que acaba de configurar para este proyecto.

    De esta forma, se garantiza que el proyecto usa el nuevo perfil para la firma de código. Para ver la documentación oficial de aprovisionamiento de dispositivos Xamarin, consulte Aprovisionamiento de dispositivos Xamarin.

Configuración del proyecto de iOS en Visual Studio

  1. En Visual Studio, haga clic con el botón derecho en el proyecto y después haga clic en Propiedades.

  2. En las páginas de propiedades, haga clic en la pestaña Aplicación de iOS y actualice el identificador con el id. que creó anteriormente.

  3. En la pestaña iOS Bundle Signing (Registro de agrupación de trabajos iOS), seleccione la identidad y el perfil de aprovisionamiento que acaba de configurar para este proyecto.

    De esta forma, se garantiza que el proyecto usa el nuevo perfil para la firma de código. Para ver la documentación oficial de aprovisionamiento de dispositivos Xamarin, consulte Aprovisionamiento de dispositivos Xamarin.

  4. Haga doble clic en Info.plist para abrirlo y, a continuación, habilite RemoteNotifications en Background Modes (Modos en segundo plano).

Incorporación de notificaciones de inserción a la aplicación

  1. En QSTodoService, agregue la siguiente propiedad para que AppDelegate pueda adquirir el cliente móvil:

    public MobileServiceClient GetClient {
        get
        {
            return client;
        }
        private set
        {
            client = value;
        }
    }
    
  2. Agregue la siguiente instrucción using al principio del archivo AppDelegate.cs .

    using Microsoft.WindowsAzure.MobileServices;
    using Newtonsoft.Json.Linq;
    
  3. En AppDelegate, reemplace el evento FinishedLaunching:

     public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
     {
         // registers for push for iOS8
         var settings = UIUserNotificationSettings.GetSettingsForTypes(
             UIUserNotificationType.Alert
             | UIUserNotificationType.Badge
             | UIUserNotificationType.Sound,
             new NSSet());
    
         UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
         UIApplication.SharedApplication.RegisterForRemoteNotifications();
    
         return true;
     }
    
  4. En el mismo archivo, reemplace el evento RegisteredForRemoteNotifications. Con este código va a registrar una notificación de plantilla simple que se enviará a todas las plataformas admitidas por el servidor.

    Para más información sobre las plantillas con Notification Hubs, vea Plantillas.

    public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
    {
        MobileServiceClient client = QSTodoService.DefaultService.GetClient;
    
        const string templateBodyAPNS = "{\"aps\":{\"alert\":\"$(messageParam)\"}}";
    
        JObject templates = new JObject();
        templates["genericMessage"] = new JObject
        {
            {"body", templateBodyAPNS}
        };
    
        // Register for push with your mobile app
        var push = client.GetPush();
        push.RegisterAsync(deviceToken, templates);
    }
    
  5. A continuación, reemplace el evento DidReceivedRemoteNotification :

     public override void DidReceiveRemoteNotification (UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
     {
         NSDictionary aps = userInfo.ObjectForKey(new NSString("aps")) as NSDictionary;
    
         string alert = string.Empty;
         if (aps.ContainsKey(new NSString("alert")))
             alert = (aps [new NSString("alert")] as NSString).ToString();
    
         //show alert
         if (!string.IsNullOrEmpty(alert))
         {
             UIAlertView avAlert = new UIAlertView("Notification", alert, null, "OK", null);
             avAlert.Show();
         }
     }
    

Ahora su aplicación está actualizada para que sea compatible con las notificaciones push.

Prueba de las notificaciones push en su aplicación

  1. Presione el botón Run (Ejecutar) para crear el proyecto e iniciar la aplicación en un dispositivo compatible con iOS. A continuación, haga clic en OK (Aceptar) para aceptar las notificaciones push.

    Nota

    Debe aceptar de forma explícita las notificaciones push desde su aplicación. Esta solicitud solo se produce la primera vez que se ejecuta la aplicación.

  2. En la aplicación, escriba una tarea y luego haga clic en el icono de signo de suma ( + ).

  3. Compruebe que se ha recibido la notificación y, a continuación, haga clic en Aceptar para descartarla.

  4. Repita el paso 2 y cierre de inmediato la aplicación. A continuación, compruebe que se muestra una notificación.

Ha completado correctamente este tutorial.