Código generado por el Asistente para notificaciones push

Mediante el uso de un asistente en Visual Studio, puede generar notificaciones push desde un servicio móvil que se creó con Azure Mobile Services. El asistente de Visual Studio genera código para ayudarle a empezar. En este tema se explica cómo el asistente modifica su proyecto, qué hace el código generado, cómo usar este código y qué puede hacer a continuación para sacar el máximo partido a las notificaciones push. Consulta descripción general de Servicios de notificaciones push de Windows (WNS).

Cómo el asistente modifica tu proyecto

El asistente para notificaciones push modifica el proyecto de las maneras siguientes:

  • Agrega una referencia al cliente administrado de Mobile Services (MobileServicesManagedClient.dll). No es aplicable a los proyectos de JavaScript.
  • Agrega un archivo en una subcarpeta en servicios y asigna un nombre al archivo push.register.cs, push.register.vb, push.register.cpp o push.register.js.
  • Crea una tabla de canales en el servidor de bases de datos para el servicio móvil. La tabla contiene información necesaria para enviar notificaciones push a instancias de aplicación.
  • Crea scripts para cuatro funciones: eliminar, insertar, leer y actualizar.
  • Crea un script con una API personalizada, notifyallusers.js, que envía una notificación push a todos los clientes.
  • Agrega una declaración al archivo de App.xaml.cs, App.xaml.vb o App.xaml.cpp, o agrega una declaración a un nuevo archivo, service.js, para proyectos de JavaScript. La declaración declara un objeto MobileServiceClient, que contiene la información necesaria para conectarse al servicio móvil. Puede acceder a este objeto MobileServiceClient, denominado MyServiceNameClient, desde cualquier página de la aplicación mediante el nombre App.Cliente MyServiceName.

El archivo services.js contiene el código siguiente:

var <mobile-service-name>Client = new Microsoft.WindowsAzure.MobileServices.MobileServiceClient(
                "https://<mobile-service-name>.azure-mobile.net/",
                "<your client secret>");

Registro de notificaciones push

En push.register.*, el método UploadChannel registra el dispositivo para recibir notificaciones push. La tienda realiza un seguimiento de las instancias instaladas de tu aplicación y proporciona el canal de notificaciones push. See PushNotificationChannelManager.

El código de cliente es similar tanto para el back-end de JavaScript como para el back-end de .NET. De forma predeterminada, al agregar notificaciones push para un servicio back-end de JavaScript, se inserta una llamada de ejemplo a notifyAllUsers custom API en el método UploadChannel.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.MobileServices;
using Newtonsoft.Json.Linq;

namespace App2
{
    internal class mymobileservice1234Push
    {
        public async static void UploadChannel()
        {
            var channel = await Windows.Networking.PushNotifications.PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();

            try
            {
                await App.mymobileservice1234Client.GetPush().RegisterNativeAsync(channel.Uri);
                await App.mymobileservice1234Client.InvokeApiAsync("notifyAllUsers");
            }
            catch (Exception exception)
            {
                HandleRegisterException(exception);
            }
        }

        private static void HandleRegisterException(Exception exception)
        {
            
        }
    }
}
Imports Microsoft.WindowsAzure.MobileServices
Imports Newtonsoft.Json.Linq

Friend Class mymobileservice1234Push
    Public Shared Async Sub UploadChannel()
        Dim channel = Await Windows.Networking.PushNotifications.PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync()

        Try
            Await App.mymobileservice1234Client.GetPush().RegisterNativeAsync(channel.Uri)
            Await App.mymobileservice1234Client.GetPush().RegisterNativeAsync(channel.Uri, New String() {"tag1", "tag2"})
            Await App.mymobileservice1234Client.InvokeApiAsync("notifyAllUsers")
        Catch exception As Exception
            HandleRegisterException(exception)
        End Try
    End Sub

    Private Shared Sub HandleRegisterException(exception As Exception)

    End Sub
End Class
#include "pch.h"
#include "services\mobile services\mymobileservice1234\mymobileservice1234Push.h"

using namespace AzureMobileHelper;

using namespace web;
using namespace concurrency;

using namespace Windows::Networking::PushNotifications;

void mymobileservice1234Push::UploadChannel()
{
    create_task(PushNotificationChannelManager::CreatePushNotificationChannelForApplicationAsync()).
    then([] (PushNotificationChannel^ newChannel) 
    {
        return mymobileservice1234MobileService::GetClient().get_push().register_native(newChannel->Uri->Data());
    }).then([]()
    {
        return mymobileservice1234MobileService::GetClient().invoke_api(L"notifyAllUsers");
    }).then([](task<json::value> result)
    {
        try
        {
            result.wait();
        }
        catch(...)
        {
            HandleExceptionsComingFromTheServer();
        }
    });
}

void mymobileservice1234Push::HandleExceptionsComingFromTheServer()
{
}
(function () {
    "use strict";

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;

    app.addEventListener("activated", function (args) {
        if (args.detail.kind == activation.ActivationKind.launch) {
            Windows.Networking.PushNotifications.PushNotificationChannelManager.createPushNotificationChannelForApplicationAsync()
                .then(function (channel) {
                    mymobileserviceclient1234Client.push.registerNative(channel.Uri, new Array("tag1", "tag2"))
                    return mymobileservice1234Client.push.registerNative(channel.uri);
                })
                .done(function (registration) {
                    return mymobileservice1234Client.invokeApi("notifyAllUsers");
                }, function (error) {
                    // Error

                });
        }
    });
})();

Las etiquetas de notificación push proporcionan una manera de restringir las notificaciones a un subconjunto de clientes. Puede usar el método registerNative (o RegisterNativeAsync) para registrarse en todas las notificaciones push sin especificar etiquetas, o puede registrarse con etiquetas proporcionando el segundo argumento, una matriz de etiquetas. Si se registra con una o varias etiquetas, solo recibirá notificaciones que coincidan con esas etiquetas.

Scripts del lado-servidor (solo backend de JavaScript)

En el caso de los servicios móviles que usan el back-end de JavaScript, los scripts del lado servidor se ejecutan cuando se producen operaciones de eliminación, inserción, lectura o actualización. Los scripts no implementan estas operaciones, pero se ejecutan cuando una llamada desde el cliente a la API rest de Windows Mobile desencadena estos eventos. A continuación, los scripts pasan el control a las propias operaciones llamando a request.execute o request.respond para emitir una respuesta al contexto de llamada. Vea Referencia de la API REST de Azure Mobile Services.

Hay una variedad de funciones disponibles en el script del lado servidor. Consulte Registro de operaciones de tabla en Azure Mobile Services. Para obtener una referencia a todas las funciones disponibles, consulte referencia de script de servidor de Mobile Services.

También se crea el siguiente código de API personalizado en Notifyallusers.js:

exports.post = function(request, response) {
    response.send(statusCodes.OK,{ message : 'Hello World!' })
    
    // The following call is for illustration purpose only
    // The call and function body should be moved to a script in your app
    // where you want to send a notification
    sendNotifications(request);
};

// The following code should be moved to appropriate script in your app where notification is sent
function sendNotifications(request) {
    var payload = '<?xml version="1.0" encoding="utf-8"?><toast><visual><binding template="ToastText01">' +
        '<text id="1">Sample Toast</text></binding></visual></toast>';
    var push = request.service.push; 
    push.wns.send(null,
        payload,
        'wns/toast', {
            success: function (pushResponse) {
                console.log("Sent push:", pushResponse);
            }
        });
}

La función sendNotifications envía una única notificación como notificación emergente. También puede usar otros tipos de notificaciones push.

Sugerencia Para obtener información sobre cómo obtener ayuda al modificar scripts, consulte Habilitación de IntelliSense para JavaScript del servidor.

 

Tipos de notificación push

Windows admite notificaciones que no son notificaciones push. Para obtener información general sobre las notificaciones, consulte Elección de un método de entrega de notificaciones.

Las notificaciones emergentes son fáciles de usar y puede revisar un ejemplo en el código Insert.js de la tabla del canal que se genera para usted. Si planea usar notificaciones de icono o distintivo, debe crear una plantilla XML para el icono y el distintivo, y debe especificar la codificación de la información empaquetada en la plantilla. Consulte Trabajar con iconos, distintivos y notificaciones del sistema.

Dado que Windows responde a las notificaciones push, puede controlar la mayoría de estas notificaciones cuando la aplicación no se está ejecutando. Por ejemplo, una notificación push podría informar al usuario que hay un nuevo mensaje de correo disponible incluso cuando la aplicación de correo local no se está ejecutando. Windows gestiona una notificación emergente visualizando un mensaje, como la primera línea de un mensaje de texto. Windows controla un icono o notificación de distintivo actualizando el icono dinámico de una aplicación para reflejar el número de mensajes de correo nuevos. De este modo, puede pedir a los usuarios de la aplicación que lo comprueben para obtener información nueva. La aplicación puede recibir notificaciones sin procesar cuando se está ejecutando y puede usarlas para enviar datos a la aplicación. Si la aplicación no se está ejecutando, puedes configurar una tarea en segundo plano para supervisar las notificaciones push.

Debe usar las notificaciones push según las directrices para las aplicaciones de Windows, ya que esas notificaciones usan los recursos de un usuario y pueden distraerse si se usa demasiado. Consulte Directrices y lista de comprobación para las notificaciones push.

Si va a actualizar iconos dinámicos con notificaciones push, también debe seguir las instrucciones de Directrices y lista de comprobación para iconos y distintivos.

Next steps

Uso de los Servicios de notificaciones push de Windows (WNS)

Puedes llamar a Windows Push Notification Services (WNS) directamente si Mobile Services no proporciona suficiente flexibilidad, si quieres escribir el código de servidor en C# o Visual Basic, o si ya tienes un servicio en la nube y quieres enviar notificaciones push desde él. Al llamar directamente a WNS, puede enviar notificaciones push desde su propio servicio en la nube, como un rol de trabajo que supervisa los datos de una base de datos u otro servicio web. El servicio en la nube debe autenticarse con WNS para enviar notificaciones push a las aplicaciones. Consulte Cómo autenticarse con el servicio de notificaciones push de Windows (JavaScript) o (C#/C++/VB).

También puede enviar notificaciones push ejecutando una tarea programada en el servicio móvil. Vea Programar trabajos periódicos en Servicios Móviles.

Advertencia Una vez que haya ejecutado el asistente de notificaciones push, no lo ejecute una segunda vez para agregar un código de registro para otro servicio móvil. Al ejecutar el asistente más de una vez por proyecto, se genera código que produce llamadas superpuestas al método CreatePushNotificationChannelForApplicationAsync, lo que conduce a una excepción en tiempo de ejecución. Si desea registrarse para recibir notificaciones push para más de un servicio móvil, ejecute el asistente una vez y vuelva a escribir el código de registro para asegurarse de que las llamadas a CreatePushNotificationChannelForApplicationAsync no se ejecuten al mismo tiempo. Por ejemplo, puedes hacerlo moviendo el código generado por el asistente en push.register.* (incluida la llamada a CreatePushNotificationChannelForApplicationAsync) fuera del evento OnLaunched, pero los detalles de esto dependerán de la arquitectura de la aplicación.