company_banner

Работаем с уведомлениями в Windows Phone 8.1



    Привет всем!

    Сегодня поговорим о новых возможностях, касающихся уведомлений в Windows/Windows Phone 8.1. Обсудим какие типы уведомлений существуют, каким способом их организовать в своем приложении, а также отметим одну из главных новинок для Windows Phone устройств — Центр уведомлений (Action Center).

    Уведомления

    Уведомления в Windows Phone это важный способ взаимодействия приложения с пользователем. Они помогают пользователю узнать об обновлении информации в приложении, оповещают его о действиях других пользователей или напоминают о необходимых активностях.

    Уведомления могут приходить от какой-либо службы или же локально от приложения.

    В Windows/Windows Phone 8.1 существует несколько способов отображения уведомлений:



    Пользователь может получить уведомление в виде информации на плитке приложения или при помощи маленького черного значка.

    Подробнее о возможностях живых плиток можно узнать из следующего курса.

    В дополнение к этому доступны и следующие способы отображения уведомлений:
    • Toast — уведомления – при получении этого типа уведомления в верхней части экрана устройства появляется текстовое оповещение. При этом на текущий момент приложение может быть неактивным. Нажав на это сообщение, можно быстро переключиться к соответствующему приложению.
    • Raw — уведомления – при этом типе уведомления содержимое передается непосредственно приложению. Приложение обрабатывает содержимое уведомления по собственному алгоритму. Эти уведомления не имеют собственного UI. Как и остальные push-уведомления, WNS сервис доставляет их к приложению из облачной или любой другой внешней службы.

    Toast — уведомления

    Для работы с Toast- уведомлениями необходимо подключить этот способ отображения уведомлений в манифесте приложения. Мы не сможем посылать Toast- уведомления, пока не укажем, что приложение может их отправлять.
    К счастью, это очень просто – переключить соответствующую настройку в Package.appxmanifest в положение «Yes»:



    Отправляем Toast-уведомление, используя следующий XML код:
    <toast>
        <visual>
            <binding template="ToastText04">
                <text id="1">headline text</text>
                <text id="2">body text</text>
            </binding>
        </visual>
    </toast>
    

    Заметим, что эта XML схема стандартна для любого вида уведомлений.
    При нажатии на Toast – уведомление пользователь сможет запустить приложение.

    Для платформы Windows доступно целых 8 шаблонов отображения Toast-уведомлений, но на Windows Phone 8.1 они имеют только один фиксированный вид, независимо от указанного разработчиком шаблона:



    Однако логика работы Toast — уведомлений на обеих платформах будет одинакова.

    Способы реализации уведомлений

    Для всех Windows устройств существуют несколько способов реализации механизма уведомлений:
    • Уведомления по расписанию (Scheduled). Такие уведомления будут стоять в очереди задач системы и запускаться в заданное фиксированное время;



      Как это работает:
      Внутри приложения используется API планировщика уведомлений, который обращается к расписанию очереди системы. Система проверяет очередь и в указанное для уведомления время отправляет обновление на плитку или Toast.

      var scheduleToast = new ScheduledToastNotification(
                              xmlDoc, 
                              DateTimeOffset.UtcNow + TimeSpan.FromDays(1.0) );
      var toastNotify = ToastNotificationManager.CreateToastNotifier();
      toastNotify.AddToSchedule(scheduleToast);
      


      При помощи класса ScheduledToastNotification создаем объект, отвечающий за уведомление по расписанию, в котором, используя ранее продемонстрированный XML код, указываем содержание и устанавливаем время в которое необходимо отобразить уведомление. А с помощью класса ToastNotificationManager создаем объект toastNotify, для которого реализована функция добавления уведомления в очередь системы AddToSchedule().
    • Периодические обновления (Periodic) — добывают данные для уведомлений из указанного URL и отображают их с указанной периодичностью – раз в час/в 6 часов/в 12 часов;



      Как это работает:
      В приложении обращаемся к службам Windows System Services, указывая что нам необходимы уведомления с периодичностью в 0.5/6/12 часов. Эти службы в свою очередь связываются с API обновлений для плиток и значков определенное количество раз, при помощи HTTP — запроса получают XML данные уведомления, которые можно передать плитке или значку.

      var periodic = TileUpdateManager.CreateTileUpdaterForApplication();
      Uri myTileFeed = new Uri("http://mysite.com/tileRSS.xml");
      periodic.StartPeriodicUpdate(myTileFeed, PeriodicUpdateRecurrence.Hour);
      


      С помощью класса TileUpdateManager создаем объект periodic, обеспечивающий периодическое обновление плитки. Далее создаем URI канал myTileFeed, в который будут транслироваться данные для уведомления в формате xml. Объект типа PeriodicUpdateRecurrence позволит установить необходимую периодичность уведомлений, поступающих из канала myTileFeed.
      Существует более простой способ реализации периодических уведомлений, используя настройки файла Package.appxmanifest:



      Необходимо только выбрать периодичность и указать URI канал.
    • Локальные уведомления приложения (Local);



      Как это работает:
      Приложение использует для уведомлений обновления плиток и значков, в фоном режиме уже обращается к API Toast – уведомлений.

      BadgeNotification newBadge = new BadgeNotification(badgeDoc);
      BadgeUpdater update = BadgeUpdateManager.CreateBadgeUpdaterForApplication();
      update.Update(newBadge);
      


      Создаем значок с помощью объекта типа BadgeNotification и функцией Update(), реализованной для объекта типа BadgeUpdater, мгновенно обновляем значок.


    Ниже представлена таблица возможности использования способов реализации уведомлений в зависимости от их типа:



    Не оставим без внимания последний способ реализации уведомлений — push-уведомления. Рассмотрим его подробнее.

    Push уведомления

    До текущего релиза для подобного типа уведомлений в Windows 8.0 и Windows Phone 8.0 использовались два различных сервиса: служба Microsoft Push Notification Services (MPNS) для телефонов и Windows Notification Services (WNS) для остальных устройств на Windows.

    Однако, теперь Push-уведомления для любых устройств Windows/Windows Phone 8.1 реализуются через службу WNS.

    Какие преимущества получат разработчики, используя WNS:
    • Одинаковый подход для любых устройств на Windows;
    • Единый процесс регистрации приложений для push-уведомлений;
    • Единый шаблон push-уведомлений для Windows/Windows Phone 8.1 платформ.


    Как это работает:
    1. Windows Phone 8.1 приложение связывается с Windows Notification Client платформой для получение URI канала приложения, который уникален для каждого устройства и приложения;
    2. Далее URI канал необходимо зарегистрировать в облачном сервисе;
    3. Облачный сервис проводит аутентификацию WNS сервиса, предоставляя свои данные (пакет SID и секретный ключ), и предоставляет доступ, который позволяет сервису отправлять уведомления. Теперь можно отправлять push –уведомления с помощью этой службы;
    4. Облачная служба, в соответствующее время посылает push-уведомление службе WNS;
    5. WNS связывается с Windows Notification Client платформой, которая производит обновление любого из заданных типов уведомлений.




    Подробнее о работе WNS службы можно прочитать здесь.

    Ниже реализуем механизм push-уведомлений в приложении по шагам, выполняя ряд необходимых действий:

    Для начала произведем все необходимые приготовления в Центре разработки, используя свой аккаунт разработчика:



    Нажимаем Submit App и резервируем имя предполагаемого приложения:



    Заполним App Info:



    Спустимся ниже и в More Options найдем необходимые для WNS настройки:



    Переходим по ссылке here:



    И получаем все необходимые данные для дальнейшей работы.

    В Visual Studio создадим тестовое универсальное приложение:



    В обозревателе решений нажимаем правой кнопкой мыши на проект для Windows Phone и выбираем Associate App with the Store:



    Запустится мастер связывания:



    Авторизуемся, используя аккаунт разработчика и выберем приложение, которые мы регистрировали до этого:



    Все данные заполнились автоматически:



    После клика на Associate, в проекте Windows Phone будет создан Package.StoreAssociation.xml файл.

    Авторизуемся в панели управления Azure и нажимаем кнопку Создать:



    Нажимаем на Службы Приложений -> Service Bus -> Концентратор уведомлений



    Нажимаем на Быстро создать и заполняем необходимые данные:



    Создаем новый концентратор уведомлений (Notification Hub):



    Нажимаем на только что созданное пространство имен TestDemoPushHub-ns и находим только что созданный концентратор уведомлений:



    Перейдем в настройки концентратора уведомлений, где заполним отмеченными ранее данными необходимые поля:



    Теперь концентратор уведомлений настроен, как WNS служба. Следующая информация будет необходима для подключения приложения к концентратору уведомлений:



    Эту информацию можно получить при нажатии на кнопку «Сведения о подключении»:



    Подключаем свое приложение к концентратору уведомлений.

    Правой кнопкой мыши нажимаем на решение в Visual Studio:



    В диалоговом окне Manage NuGet Packages ищем WindowsAzure.Messaging.Managed и нажимаем Install:



    Дальше выбираем установку пакета для нужного проекта:



    Теперь мы загрузили, установили и добавили ссылки на библиотеки Azure Messaging во все проекты, используя WindowsAzure.Messaging.Managed NuGet package.

    Открываем файл App.xaml.cs из общего проекта Shared и подключаем следующие библиотеки:
    using Windows.Networking.PushNotifications;
    using Microsoft.WindowsAzure.Messaging;
    using Windows.UI.Popups;
    

    Там же добавляем метод InitNotifictionAsync:
    private async void InitNotificationsAsync()
    {
        var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
        var hub = new NotificationHub("TestDemoPushHub", "Endpoint=sb://testdemopushhub-ns.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=z2Sj7sgwGpkvTyE/H5QyiffCpwCjV/PmJBY1h4WhXac=");
              
        var result = await hub.RegisterNativeAsync(channel.Uri);
    
        // Displays the registration ID so you know it was successful
        if (result.RegistrationId != null)
        {
            var dialog = new MessageDialog("Registration successful: " + result.RegistrationId);
            dialog.Commands.Add(new UICommand("OK"));
            await dialog.ShowAsync();
        }
    }
    

    Этот метод получает URI канал для приложения от WNS, затем регистрирует этот URI канал в концентраторе уведомлений. При создании переменной hub не забудем указать имя нашего концентратора уведомлений и строку подключения с доступом Listen:
    var hub = new NotificationHub("<hub name>", "<connection string with listen access>"); ("TestDemoPushHub", "Endpoint=sb://testdemopushhub-ns.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=z2Sj7sgwGpkvTyE/H5QyiffCpwCjV/PmJBY1h4WhXac=");
    

    Где данные для необходимых переменных достаем из Сведений о подключении концентратора уведомлений в Azure:

    hub name = TestDemoPush;
    connection string listen access = DefaultListenSharedAccessSignature;

    В обработчике события OnLaunched в App.xaml.cs добавим вызов метода InitNotificationsAsync().

    Это необходимо для того, чтобы URI канал для ваших уведомлений регистрировался при каждом запуске приложения.

    В обозревателе решений найдем и настроим файл Package.appxmanifest:



    Установим настройку Toast capable в положение Yes.
    Теперь приложение готово к тому чтобы принимать уведомления.

    Основная функция приложения показывать результат регистрации канала:



    Отправим уведомления приложению.

    Создадим консольное приложение, через которое будем отправлять push-уведомления:



    Нажимаем Tools-> NuGet Package Manager-> Package Manager Console



    Таким образом, добавим ссылку на Azure Service Bus SDK.

    Подключим в проекте следующую библиотеку: using Microsoft.ServiceBus.Notifications;

    И добавим метод для отправки уведомлений:
    private static async void SendNotificationAsync()
    {
        NotificationHubClient hub = NotificationHubClient
            .CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
        var toast = @"<toast><visual><binding template=""ToastText01""><text id=""1"">Hello from a .NET App!</text></binding></visual></toast>";
        await hub.SendWindowsNativeNotificationAsync(toast);
    }
    

    В методе создаем объект типа NotificationHubClient, где заполняем необходимые данные для подключения:

    connection string with full access = DefaultFullSharedAccessSignature (вашего Service Bus);
    hub name = TestDemoPushHub.

    А дальше создаем и заполним данные самой переменной, отвечающей за содержание уведомления:
    <toast><visual><binding template=""ToastText01""><text id=""1"">Hello, guys!</text></binding></visual></toast>";
    

    В теле программы вызовем написанный метод:
    SendNotificationAsync();

    Запускаем и получаем push-уведомления от приложения TestDemoPush на телефон:



    Посмотрим на уведомления в Центре уведомлений:



    При нажатии на любое из них перейдем в приложение.

    Центр уведомлений

    Еще немного слов об одной из ключевых нововведений в Windows Phone 8.1 — Центре уведомлений (Action Center). Вызывается он свайпом вниз от верхней границы экрана. В него попадают все новые сообщения, уведомления, упоминания и напоминания от различных приложений. Так же в Центре уведомлений расположены четыре переключателя, которые можно поменять на вызов любых настроек.

    Теперь пользователи выбирают какие из приложений могут отображать уведомления в Центре уведомлений, а разработчики приложений получили специальные API, которые дают возможность выбирать какие из действий будут доступны из центра уведомлений. При помощи этих API и механизмов разработчики приложений могут управлять всплывающими уведомлениями.

    Новые возможности для разработчиков:
    • Удаление одного или нескольких уведомлений;
    • Тегирование и группы уведомлений;
    • Замена устаревшего уведомления на новое;
    • Установка срока действия уведомления;
    • «Goast Toast» – уведомления, которые появляется только в Центре уведомлений.

    Центр уведомлений доступен только для телефона.

    Подробнее о возможностях Центра уведомления для разработчиков можно узнать из этого курса.

    Заключение

    Уведомления в Windows Phone 8.1 — это целый набор разнообразных инструментов, предоставляющий разработчику возможность самому выбрать способ общения своего приложения с пользователем. Особое внимание все же советую обратить на невероятно удобную и мощную службу WNS, чьи преимущества оказались особенно заметны на мобильных устройствах.

    Полезные ссылки

    Channel 9: Building Apps for Windows Phone 8.1
    Microsoft Azure: Getting Started with Notification Hubs
    MVA: Размещение и продвижение приложений в Windows Store
    Обучающие курсы виртуальной академии Microsoft (MVA)
    Портал Microsoft Azure
    Центр разработки Windows
    Загрузить бесплатную или пробную Visual Studio 2013
    Как опубликовать приложение в Windows Store
    Скачать пример приложения из этой статьи
    • +31
    • 28.2k
    • 4
    Microsoft
    475.93
    Microsoft — мировой лидер в области ПО и ИТ-услуг
    Share post

    Comments 4

      +1
      Вопрос о возможности добавления некоторых условий, так что бы только некоторые устройства получали сообщения, по каким-то критериям или целенаправлено? В бизнес-приложениях очень бы пригодилось.
        0
        В notification hub это можно настраивать. И потом подписываете пользователя на нужные тэги. И отпарвляете уведомления только этим тэгам.
        0
        По факту нормально работать с нотификациями по различным критериям невозможно. Если нужно каждый раз по каким-то особенным критериям отправлять уведомления, то нужно поднимать свой сервис. Тэгирование — это вот необходимый минимум, но к сожалению не достаточный.
          0
          а чем он недостаточный? вы могли бы описать сценарий, когда тегирования недостаточно?

        Only users with full accounts can post comments. Log in, please.