Периодические обновления
Всплывающие уведомления
До сих пор в этой лекции мы занимались вопросами плиток и обновлений, что, на самом деле, является отличным вступлением для нашей следующей темы – всплывающих уведомлений. Это потому что процесс создания и отправки всплывающих уведомлений весьма похож на то, что мы выполняли для плиток, и даже проще, так как для них нет периодических уведомлений. Они исходят либо из выполняющегося приложения, либо от фоновых задач, либо из push-уведомлений, как мы увидим в разделе "Push-уведомления и Windows Push Notification Service" ниже. К счастью, тема всплывающих уведомлений гораздо короче, чем тема плиток. Вот основные аспекты, касающиеся всплывающих уведомлений:
- Всплывающие уведомления всегда используют параметры приложения Текст переднего плана (Foreground Text) и Цвет фона (Background Color), заданные в манифесте для брендирования приложения, вместе с маленьким значком (small logo). Нет средств для изменения этих параметров. Атрибуты брендирования в XML игнорируются всплывающими уведомлениями.
- У приложения должен быть включен параметр Всплывающие уведомления (Toast Capable) в манифесте для того, чтобы для него могли появляться всплывающие уведомления. Эту настройку можно найти на закладке Интерфейс приложения (Application UI), в группе параметров Уведомления (Notifications):
- Как было показано на рис. 4.8, пользователь может отключить всплывающие уведомления для конкретного приложения или отключить их для всей системы (что полезно, когда я записываю скринкасты!). Системные администраторы так же могут отключить всплывающие уведомления с помощью групповой политики. Для того, чтобы программно проверить их статус, обратитесь к свойству ToastNotifier.setting (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toastnotifier.setting.aspx ), которое содержит значение из перечисления NotificationSetting, которое может принимать значения enabled, disabledForApplication, disabledForUser, или disabledByGroupPolicy.
- Когда всплывающие уведомления включены, они всегда появляются в правом верхнем углу экрана (в языках с письменностью слева направо), или в верхнем левом углу (в языках с письменностью справа налево). Этот параметр не поддается настройке.
- Всплывающими уведомлениями можно управлять посредством экземпляров класса Windows.UI.Notifications.ToastNotification (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toastnotification.aspx ) или Windows.UI.Notifications.ScheduledToastNotification (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.scheduledtoastnotification.aspx ). Первый из них поддерживает свойство expirationTime. Второй, с помощью которого можно размещать запланированные уведомления, поддерживает свойства deliveryTime, snoozeInterval, и maximumSnoozeCount.
-
Как и в случае с плитками, содержимое всплывающего уведомления создается с помощью полезных данных XML, по одному из четырех текстовых шаблонов и четырех шаблонов, которые могут содержать изображения и текст, как показано в "Каталоге шаблонов всплывающих уведомлений" ( http://msdn.microsoft.com/library/windows/apps/hh761494.aspx). Шаблоны уведомлений можно получить с помощью метода getTemplateContent объекта ToastNotificationManager (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toastnotificationmanager.aspx ), их можно создавать из строк, или с помощью Notifications Extensions Library. В XML могут быть установлены различные параметры:
- Уведомление может включать в себя текст и изображение, где изображение может поступать из пакета приложения, из данных приложения, или из удаленного источника (при установке возможности Интернет (Клиент) (Internet (Client))). К изображениям применимы те же ограничения, что и в случае с плитками: максимальное разрешение 1024x1024 и максимальный размер файла в 200 Кб. В отличие от плиток, однако, если изображение превышает эти лимиты, уведомление будет показано, но с серым изображением-заполнителем вместо изображения.
- Всплывающее уведомление может задать предопределенный звук для проигрывания при его появлении, с возможностью автоповтора. Пользовательские звуки не поддерживаются.
- По умолчанию, всплывающие уведомления появляются на сем секунд (пять секунд в непрозрачном виде и две секунды на появление и исчезновение), или до их активации, либо закрытия. (Управление длительностью нахождения их в непрозрачном режиме доступно посредством свойства (Windows.UI.ViewManagement.UISettings.messageDuration ( http://msdn.microsoft.com/library/windows/apps/windows.ui.viewmanagement.uisettings.messageduration.aspx)). Вы можете отправлять уведомления с повышенной длительностью отображения, повторяющиеся уведомления, которые отображаются заданное количество раз с некоторым интервалом.
- Всплывающие уведомления отправляют посредством класса ToastNotifier (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toastnotifier.aspx ), в частности, с помощью его методов show и addToSchedule , соответтсвенно, для немедленного и запланированного показа. Класс ToastNotifier так же предоставляет методы для управления ранее запланированными уведомлениями.
- Как и дополнительные плитки, всплывающие уведомления могут быть созданы (и обычно так и следует поступать) со специальными аргументами в полезных данных XML, которые передаются обработчику события activated приложения с видом активации launch. Без подобных аргументов, событие activated вызвано не будет, но в противном случае приложение обрабатывает активацию так же, как это происходит для дополнительных плиток. С другой стороны, приложение может прослушивать специальные события, которые вызывает само всплывающее уведомление, когда пользователь активирует или закрывает его.
В следующих разделах представлены подробности по многим из этих пунктов, с использованием примеров "Всплывающие уведомления" (http://code.msdn.microsoft.com/windowsapps/toast-notifications-sample-52eeba29 ) и "Запланированные уведомления" (http://code.msdn.microsoft.com/windowsapps/Scheduled-notifications-da477093 ). Так же мы рекомендуем вам посмотреть материал "Руководство и контрольный список для всплывающих уведомлений" (http://msdn.microsoft.com/library/windows/apps/hh465391.aspx ).
Совет.Как упомянуто выше, всплывающие уведомления не работают в имитаторе Visual Studio. Вы должны запускать эти примеры в режимах Локальный компьютер (Local Machine) или Удаленный компьютер (Remote Machine) для того, чтобы увидеть всплывающие уведомления.
Основы создания всплывающих уведомлений
Начнем со Сценариев 1, 2 и 3 примера "Всплывающие уведомления", который показывает, как отправлять уведомления из работающего приложения с использованием текстовых шаблонов и шаблонов с текстом и изображением. Как показано на рис. 5.1. и рис. 5.2 (для текстовых шаблонов и текстовых шаблонов с изображением, соответственно), одновременно могут отображаться до трех уведомлений. Помните о том, что в манифесте параметр Всплывающие (Toast Capable) должен быть установлен в значение Да (Yes) для того, чтобы это работало.
увеличить изображение
Рис. 5.1. Отправка текстовых уведомлений из Сценария 1 примера "Всплывающие уведомления" (нижняя часть изображения обрезана)
увеличить изображение
Рис. 5.2. Отправка уведомлений, совмещающих картинку и текст из Сценария 3 примера (Нижняя часть изображения снова обрезана). Сценарий 2 делает то же самое с изображениями из пакета приложения, что мне, как родителю, не так интересно, как фото моего малыша!
Точно так же, как мы видели ранее для плиток, пример показывает, как создавать полезные данных XML для уведомлений с использованием шаблона, полученного из ToastNotificationManager.getTemplateContent (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toastnotificationmanager.gettemplatecontent.aspx ), с применением Notifications Extensions Library, или из XML-строк. Полученный XmlDocument затем используется для создания объекта ToastNotification который, в свою очередь, передается методу ToastNotifier.show.
Например, вот как Сценарий 1 (js/scenario1.js) отправляет всплывающее уведомление с использованием шаблона toastText01 (значение из перечисления ToastTemplateType (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toasttemplatetype.aspx )) с помощью getTemplateContent:
var Notifications = Windows.UI.Notifications; function displayToastUsingXmlManipulation(e) { // toastTemplateName устанавливается в соответствии с нажатой кнопкой var notificationManager = Notifications.ToastNotificationManager; var toastXml = notificationManager.getTemplateContent( Notifications.ToastTemplateType[toastTemplateName]); // Заполнение XmlDocument в toastXml (код опущен) var toast = new Notifications.ToastNotification(toastXml); notificationManager.createToastNotifier().show(toast); }
Следующий код из Сценария 3 (js/scenario3.js) показывает создание всплывающего уведомления из XML-строк (toastImageAndText01). Как и в случае с плитками, вы можете использовать URI ms-appx:///, ms-appdata:///local, или http:// для того, чтобы ссылаться на изображения (данные в пакете приложения, данные приложения, и изображения с удаленных источников, соответственно):
function displayWebImageToastWithStringManipulation(e) { // toastTemplateName устанавливается в соответствии с нажатой кнопкой var notificationManager = Notifications.ToastNotificationManager; var toastXmlString; if (templateName === "toastImageAndText01") { toastXmlString = "<toast> " + "<visual version='1'> " + "<binding template='toastImageAndText01'> " + "<text id='1'>Body text that wraps over three lines</text>" + "<image id='1' src='" + urlBox.value + "' alt='" + altText + "'/>" + " </binding>" + " </visual>" + " </toast>"; } else { // Другие варианты опущены } var toastDOM = new Windows.Data.Xml.Dom.XmlDocument(); toastDOM.loadXml(toastXmlString); var toast = new Notifications.ToastNotification(toastDOM); notificationManager.createToastNotifier().show(toast); }
Масло и джем: опции для ваших тостов (всплывающих уведомлений)
Помимо свойств, которые вы можете назначить при создании объекта ToastNotification (или объекта ScheduledToastNotification), есть некоторые дополнительные настройки, которые вы можете включить в XML, как описано в материале "Схема всплывающих уведомлений" (http://msdn.microsoft.com/library/windows/apps/br230849.aspx ):
- Корневой элемент toast в XML имеет необязательные атрибуты launch и duration. Атрибуту launch может быть назначена строка, которая будет передана обработчику активации приложения в качестве eventArgs.detail.arguments, в точности так же, как в случае с дополнительными плитками (смотрите раздел "Активация приложения с помощью дополнительной плитки" ранее в этой лекции. Атрибут duration может принимать значения short (пять секунд, или значение из раздела Параметры ПК > Специальные возможности (PC Settings > Ease of Access)) или long (25 seconds или значение из раздела Параметры ПК > Специальные возможности (PC Settings > Ease of Access), в зависимости от того, что больше; взгляните на рис. 4.7).
- Элементы visual и binding в XML могут иметь атрибуты branding и addImageQuery , которые работают так же, как их аналоги для плиток. Обратитесь к разделам о плитках, которые мы рассмотрели выше. Элемент image так же поддерживает addImageQuery для настроек масштабирования, языка и контрастности.
- Элементы visual, binding, и text поддерживают атрибут lang для идентификации языка текущего приложения.
Элемент toast так же может иметь дочерний элемент audio (http://msdn.microsoft.com/library/windows/apps/br230842.aspx ), с помощью которого вы можете добавить к уведомлению звуки, при условии, тчо пользователь не отключил все звуки уведомлений в разделе Параметры ПК > Уведомления (PC Settings > Notifications). (смотрите рис. 4.8) Конкретный звук устанавливается с помощью атрибута src и должен быть представлен одним из следующих строковых значений, как описано в материале "Каталог параметров звука для всплывающих уведомлений" (http://msdn.microsoft.com/library/windows/apps/Hh761492.aspx ) :
- ms-winsoundevent:Notification.Default
- ms-winsoundevent:Notification.IM
- ms-winsoundevent:Notification.Mail
- ms-winsoundevent:Notification.Reminder
- ms-winsoundevent:Notification.SMS
- ms-winsoundevent:Notification.Looping.Alarm
- ms-winsoundevent:Notification.Looping.Alarm2
- ms-winsoundevent:Notification.Looping.Call
- ms-winsoundevent:Notification.Looping.Call2
В свою очередь, атрибут audio.silent управляет тем, будут ли проигрываться звуки (false, по умолчанию) или будут ли они отключены (true). Если атрибут toast.duration установлен и вы установили audio.src в одно из последних четырех вышеописанных значений звуков из группы "Looping", вы так же можете установить audio.loop в значение true (для того, чтобы повторять звук), или в значение false (для однократного проигрывания звука, по умолчанию).
Сценарий 4 из примера "Всплывающие уведомления" позволяет вам воспроизводить различные звуки уведомлений – разные кнопки выбирают разные звуки. Текст каждой кнопки (в переменной toastSoundSource) присоединяется к ms-winsoundevent:Notification., как в этом XML, использованном для создания уведомления:
">audio src='ms-winsoundevent:Notification." + toastSoundSource + "'/>"
Сценарий 6 показывает использование атрибута loop в XML:
">audio loop='true' src='ms-winsoundevent:Notification.Looping.Alarm'/>"
Слышите что-нибудь? Когда я впервые запустил эти примеры, я ничего не слышал. Некоторое время ушло на то, чтобы понять почему, поэтому позвольте мне избавить вас от этих сложностей.
Значения в атрибуте audio.src просто указывают на различные системные знвуки, которые назначены в разделах Панель управления > Диспетчер устройств (Control Panel > Hardware) и Звук >Звуки (Sounds > Change System Sounds), что показано на изображении ниже. Устав от всех писков, звонков и прочего шума, который когда-то был в моде на персональных компьютерах, я попросту выбрал опцию Без звука (No sounds) в группе Звуковая схема (Sound Scheme). В результате, системным событиям в списке Программные события (Program Events) не были назначены звуки, и звуки не воспроизводились для всплывющих уведомлений. Когда я выбрал схему По умолчанию (Default), я смог слышать звуки всплывающих уведомлений.
Короче говоря, у пользователя есть полный контроль над звуками, и общий, в Параметрах ПК (PC Settings), и над конкретными звуками, в диалоговом окне, показанном ниже. В итоге, если вы находите оправданным использование звуков, просто выберите тот, который лучше всего подходит сущности вашего уведомления и оставьте все как есть.
Время пить чай: запланированные всплывающие уведомления
Выдача всплывающих уведомлений из работающего приложения – это замечательно, но используется это не часто, так как пользователь уже работает с тем же самым приложением. Гораздо интереснее варианты, когда приложение не обязательно должно быть запущено при появлении уведомления. Именно поэтому всплывающие уведомления часто используются с push-уведомлениями и с фоновыми задачами, как мы увидим в последних двух разделах лекции 6, но еще одно средство – это запланированные всплывающие уведомления, которые просто появляются в некоторое время, независимо от того, исполняется ли приложение. Это отличный способ предложить пользователям запустить вашу программу снова.
Запланированные всплывающие уведомления создают с использованием Windows.UI.Notifications.ScheduledToastNotification ( http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.scheduledtoastnotification.aspx) вместо обычного ToastNotification, которым мы пользовались. Есть две формы запланированных уведомлений, о чем свидетельствует пара конструкторов этого объекта:
- ScheduledToastNotification(content, deliveryTime) Создает запланированное всплывающее уведомление для однократного показа из XmlDocument, описывающего уведомление в аргументе content и используя UTC-время типа DateTime , описывающее время, когда оно должно появиться, в аргументе deliveryTime.
- ScheduledToastNotification(content, deliveryTime, snoozeInterval, maximumSnoozeCount) Создает повторяющееся запланированное всплывающее уведомление, содержимое которого появится во время, заданное в deliveryTime. Если уведомление было закрыто – или явным образом, или автоматически, оно продолжит появляться и появится еще столько раз, сколько задано в параметре maximumSnoozeCount с интервалом, заданным в миллисекундах в snoozeInterval. Параметр snoozeInterval должен содержать значение от 60 секунд до 60 минут; для более длительных интервалов лучше создать отдельные запланированные уведомления.
У ScheduledToastNotification так же есть свойство id, строка длиной максимум 16 символов, которая используется для идентификации данного всплывающего уведомления. Если вы запланировали уведомления с тем же id, что и существующее, то новое уведомление заменит старое.
Во вслех случаях уведомление планируется с помощью вызова метода ToastUpdater.addToSchedule, которому передается объект уведомления. Ниже этот процесс показан в коде из Сценария 1 примера "Запланированные уведомления" (js/scenario1.js), где toastDOM это XmlDocument, который содержит данные уведомления, а dueTime определяется элементом управления пользовательского интерфейса примера. Для начала – уведомление, которое исполняется один раз:
var Notifications = Windows.UI.Notifications; toast = new Notifications.ScheduledToastNotification(toastDOM, dueTime); Notifications.ToastNotificationManager.createToastNotifier().addToSchedule(toast);
Теперь, уведомление, которое будет повторяться пять раз с 60-секундными интервалами (эта опция включается, если вы установили флаг Repeat (Повторять) в интерфейсе примера):
toast = new Notifications.ScheduledToastNotification(toastDOM, dueTime, 60 * 1000, 5); Notifications.ToastNotificationManager.createToastNotifier().addToSchedule(toast);
Для перечисления уже запланированных уведомлений, вызовите ToastNotifier.getScheduledToastNotifications (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toastnotifier.getscheduledtoastnotifications.aspx ). Он вернет вектор объектов ScheduledToastNotification, каждое из которых может быть отменено посредством ToastNotifier.removeFromSchedule (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toastnotifier.removefromschedule.aspx ). Использование этих методов показано в Сценарии 2 примера "Запланированные уведомления", который я оставляю вам для более подробного ознакомления. Кроме того, есть некоторые советы по отладке, в материале "Руководство и контрольный список для запланированных уведомлений" (http://msdn.microsoft.com/library/windows/apps/hh761464.aspx ), главным образом хочу отметить, что система имеет ограничение на общее количество уведомлений, равное 4096, и не забудьте установить свойство Всплывающие уведомления (Toast Capable) в манифесте приложения в значение Да (Yes)
События всплывающих уведомлений и активация
Что касается всплывающих уведомлений, мы, возможно, сохранили лучшие темы напоследок! Главная цель всплывающих уведомлений – привлечь внимание пользователя и предложить им активировать ваше приложение для того, чтобы что-нибудь сделать. Приожение обычно показывает страницу, которая соответствует содержимому уведомления.
Самый простой случай активации касается запланированного уведомления, или того, которое было отправлено посредством фоновой задачи или через push-уведомление. Во всех этих случаях приложение не исполняется, таким образом, Windows запустит его с видом активации launch, где значение атрибута уведомления toast.launch будет в свойстве eventArgs.detail.arguments события activated. Это, повторюсь, идентично тому, как работают дополнительные плитки и вы можете обработать значение аргумента так, как вам нужно.
Если приложение не выполняется при активации уведомления, оно будет запущено даже если атрибут toast.launch пуст. Таким образом, всплывающие уведомления, которые появляются при неисполняющемся приложении можно использовать, если нужно, для целей обычного запуска приложения. С другой стороны, если исполняющееся приложение отправляет уведомление без значения toast.launch его событие activated вызвано не будет. Это означает, что активация с помощью всплывающего уведомления, не содержащего дополнительной информации никогда не приведет к перемещению на первую страницу приложения, но зачем же тогда вызывать событие activated? Совершенно незачем. Таким образом, если исполняющееся приложение вызывает уведомление с намерением переключиться на другую часть приложения при активации уведомления, то значение launch имеет большое значение. (Среди всех сценариев в примере "Всплывающие уведомления", только Сценарий 5 предоставляет значение launch; установите точку останова в событие activated в js/default.js, и вы увидите, что это событие будет вызвано только если вы коснетесь уведомления, вызванного из Сценария 5.)
Тем не менее, исполняющемуся приложению, и без использования аргументов запуска, может быть нужно знать, когда пользователь взаимодействует с уведомлением. Для этой цели приложение может прослушивать события activated (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toastnotification.activated.aspx ), dismissed (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toastnotification.activated.aspx ) и failed (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.toastnotification.failed.aspx ) объекта ToastNotification, некоторые из которых показаны в Сценарии 5 примера. У события activated свойство eventArgs не задано, но dismissed вызвается с ToastDismissalReason в eventArgs.reason (возможные значения – userCanceled, applicationHidden, и timedOut), а событие failed вызывается с кодом ошибки в eventArgs.errorCode. (Все это – события объекта WinRT поэтому не забудьте соответствующим образом применить removeEventListener , как описано в Главе 3 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript".)
Обратите внимание, что ScheduledToastNotification не поддерживает эти события, так как предполагается, что приложение, вероятно, не будет исполняться во время вызова такого всплывающего уведомления.