Follow Me Widget

четверг, 2 мая 2013 г.

Windows Azure Notification Hubs - новый способ отправки push-уведомлений

Всем привет! Тема моей сегодняшней публикации будет касаться нового механизма отправки push-уведомлений мобильным клиентам - Windows Azure Notification Hubs. Эта технология была представлена в январе 2013 года. Несмотря на то, что  технология находится в режиме превью - она уже успела привлечь внимание многих разработчиков. Если вкратце, то Notification Hubs - это построенная на базе Windows Azure Service Bus система, позволяющая значительно упростить и расширить существующие механизмы отправки push-уведомлений мобильным клиентам (для тех из вас, кто незнаком с понятием пуш уведомлений - вот здесь можно посмотреть краткое описание механизма: Push Notifications: What are they and how do I send them). При помощи Windows Azure Notification Hubs мы можем с легкостью организовать систему уведомлений для наших мобильных устройств, при этом поддерживаются 2 платформы:
  • The Windows Push Notification Services (WNS) for Windows 8.
  • The Apple Push Notification service (APNs)
В будущем планируется поддержка Google Cloud Messaging for Android. Сегодня мы на примере увидим как отправить push-уведомление Windows 8 устройству, используя Windows Azure Notification Hubs.
Итак, наша цель отправить push-уведомление Windows Store приложению, используя при этом консольную программу и Windows Azure Notification Hubs. Само решение выглядит довольно просто (ссылка на скачивание солюшена находится в конце поста):


Солюшен состоит из 2-х проектов. Первый - EventSource, представляет собой консольное приложение, основная задача которого - это генерация сообщения и коммуникация с хабом с целью отправки push-уведомления. Второй проект - собственно само Windows Store приложение, которое будет получать приходящие уведомления. С него мы и начнем. Это пустое HTML5+Javascript приложение, основная логика которого находится в файле default.js. Другой важный файл, который можно также увидеть в проекте, это - NotificationHub,js, он содержит всю логику по взаимодействию с нотификационным хабом. Скачать данный файл можно с MSDN. 
Прежде чем мы разберем исходный код приложения необходимо выполнить настройку приложения. Во-первых, для того чтобы оно стало способным принимать пуш уведомления, необходимо включить Toast Notifications в манифесте приложения. На скриншоте внизу можно увидеть как это сделать:
Во-вторых, нам необходимо ассоциировать приложение с Windows Store аккаунтом (если у вас нет аккаунта по следующей ссылке можно прочитать как его создать: Registering for a Windows Store developer account). Связывание приложения можно осуществить при помощи пункта меню Store >Associate App With The Store

После чего откроется простой диалог, выполнив все шаги которого,  мы перейдем на сайт Windows Store разработчика, где нас попросят ввести имя приложения и задать дополнительные характеристики. Из этих характеристик нас интересуют Advanced Features.

При выборе этого пункта откроется новая страница, на которой следует кликнуть на ссылке Push Notifications And Live Services Info, после чего нас перебросят на следующую страницу, позволяющую увидеть ключи доступа (они понадобятся нам при насстройке самого хаба). Вот как выглядит конечная страница:
Следующим шагом в настройке проекта будет создание хаба. Делается это на портале Windows Azure выбором пункта New > App Services > Service Bus > Notification Hub
Нас попросят задать имя хаба, географический регион и Service Bus неймспейс, в рамках которого будет функционировать хаб. После этого новый хаб будет создан и мы сможем задать ключи безопасности для отправки уведомлений Windows 8 клиентам. Делается это в разделе Configure.

PACKAGE SID и CLIENT SECRET мы получили в момент ассоциирования Windows Store приложения с аккаунтом Windows 8 разработчика, поэтому все, что нам необходимо это перенести значения в настройки хаба. 
На этом этап настройки инфраструктуры можно считать завершенным. Давайте перейдем непосредственно к коду. Исходный код Windows Store приложения представлен в листинге ниже:
(function () {
    "use strict";

    WinJS.Binding.optimizeBindingReferences = true;

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
    var messaging = Microsoft.WindowsAzure.Messaging;

    var hub = new messaging.NotificationHub("https://[YOUR_SB_NAMESPACE].servicebus.windows.net/", "[NOTIFICATION_HUB_KEY]", "pushdemo");

    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
                var toastTemplate = '$(message)';
                var pushNotifications = Windows.Networking.PushNotifications;
                var channelOperation = pushNotifications.PushNotificationChannelManager.createPushNotificationChannelForApplicationAsync();

                channelOperation.then(function (newChannel) {
                    return newChannel.uri;
                }).then(function (channelUri) {
                    return hub.registerTemplateForApplicationAsync(channelUri, 'toast1', [], { 'X-WNS-Type': 'wns/toast' }, toastTemplate);
                }).done();
            }
            args.setPromise(WinJS.UI.processAll());
        }
    };

    app.oncheckpoint = function (args) {
    };

    app.start();
})();

Начнем с наиболее интересных участках кода. Первый важный фрагмент - это создание экземпляра хаба. 
var hub = new messaging.NotificationHub("https://[YOUR_SB_NAMESPACE].servicebus.windows.net/", "[NOTIFICATION_HUB_KEY]", "pushdemo");
Для того, чтобы создать хаб нам необходимо задать имя Service Bus неймспейса, в рамках которого функционирует хаб, и ключ безопасности (третьим параметром идет название хаба, задаваемое на портале). Ключ безопасности берется из настроек хаба, на картинке ниже можно увидеть, что для нашего приложения достаточно ключа только с правами прослушивания канала.
Далее, в обработчике события запуска приложения происходит его регистрации на хабе путем вызова метода hub.registerTemplateForApplicationAsync. Регистрация принимает адрес канала, по которому будет происходит коммуникация, название используемого шаблона уведомлений (весь список поддерживаемых темплейтов здесь) и само содержимое уведомления. В нашем случае мы используем простой текстовый темплейт, который содержит подстановочный элемент $(message). Данный элемент позволяет динамически подменять содержимое уведомлений. 
Давайте теперь посмотрим на содержимое файла Program.cs проекта EventSource.
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;
using Microsoft.ServiceBus.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EventSource
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please, enter the message: ");
            var message = Console.ReadLine();
            var cn = ServiceBusConnectionStringBuilder.CreateUsingSharedAccessSecretWithFullAccess(new Uri("sb://[YOUR_SB_NAMESPACE].servicebus.windows.net"), "[NOTIFICATION_HUB_KEY]");
            var hubClient = NotificationHubClient.CreateClientFromConnectionString(cn, "pushdemo");
            hubClient.SendTemplateNotification(new Dictionary<string, string> { { "message", message } });
        }
    }
}
После своего запуска, консольное приложение просит ввести текст отправляемого уведомления. Далее происходит создание клиента к хабу, для чего необходимо опять же задать название Service Bus неймспейса и ключ безопасности (теперь нам нужен ключ с полными правами доступа к хабу). Как только клиент будет создан, можно отправлять уведомление. Делается это при помощи метода hubClient.SendTemplateNotification. Метод принимает набор ключей и их значений. При отправке уведомления инфраструктура хаба самостоятельно подменит все упоминания названий ключей на их значения. Для  того, чтобы приложение успешно скомпилировалось необходимо предвартельно установить Nuget-пакет ServiceBus.Preview.dll
В итоге, после запуска приложения и ввода сообщения мы должны получить долгожданное  уведомление.
На этом всё! Код разработанного проекта можно найти по ссылке 
Для более детального знакомства с Windows Azure Notification Hubs рекомендую ознакомиться с дополнительным материалами по следующим ссылкам:

Комментариев нет: