Периодические обновления – это отличное доказательство того, что Microsoft по-настоящему прислушивается к мнению разработчиков. Когда была выпущена Developer Preview Windows 8, в Сентябре 2011, многие разработчики были сильно заинтересованы в реализации динамических плиток, но это могло быть реализованы лишь с помощью push-уведомлений и Windows Push Notification Service, даже если плитку нужно было обновлять не слишком часто. Другими словами, push-уведомления – это избыточно для приложений, которым каждый раз лишь нужно получить немного данных из веб-сервиса для создания обновления. Разработчики спрашивали: "Возможно ли, чтобы мое приложение исполнялось в фоновом режиме, периодически запрашивало данные с моего сервиса и затем выполняло обновление плиток и индикаторов событий?".
Это был совершенно справедливый вопрос, но, как описано выше, фоновые задачи очень тщательно контролируются и они разрешены только для специальных сценариев. Услышав этот вопрос, команда Microsoft, которая занимается плитками и уведомлениями, изучила проблему и обнаружила, что создание нового класса фоновых задач для подобных целей – это избыточно для низкочастотных обновлений плиток. Более того, они обнаружили, что даже если приложение может использовать фоновую задачу для этих целей, все они будут выполнять примерно одно и то же: получать данные с сервиса и заполнять шаблон плитки или индикатора событий. Поэтому, вместо добавления новой фоновой задачи, они добавили новый API для периодических обновлений, управляемых системой.
Этот API состоит из следующих методов классов TileUpdater (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.tileupdater.aspx ) и BadgeUpdater (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.badgeupdater.aspx ):
TileUpdater.startPeriodicUpdate и BadgeUpdater.startPeriodicUpdate Выполняют настройку Windows на запрос обновления с заданного URI с указанной периодичностью (смотрите ниже). Эти вызовы удаляют любые URI ранее зарегистрированные для плитки. Приложение может задать необязательные дату и время, когда должны начаться регулярные обновления, и во всех случаях первый запрос происходит немедленно (очень полезно для отладки). Подходящее время для этих вызовов – старт приложения, возобновление приложения, и когда изменяются настройки, которые могут вызывать необходимость смены URI.TileUpdater.stopPeriodicUpdate и BadgeUpdater.stopPeriodicUpdate Останавливает текущий процесс периодических обновлений, но не очищает существующие обновления плитки.TileUpdater.startPeriodicUpdateBatch Используется лишь для обновления плитки, идентичен startPeriodicUpdate , но принимает массив размером до 5 URI, автоматически создавая очередь обновлений с результатами (заменяя предыдущие URI). Отметим, что TileUpdater.enableNotificationQueue должен быть установлен в true перед использованием этого метода, как описано выше, в разделе "Циклические и запланированные обновления, обновления со сроком действия"Во всех этих случаях каждый из URI представлен объектом ), а периодичность опроса является значением перечисления ). Значения этого перечисления – halfHour, hour, sixHours, twelveHours, и daily (полчаса, час, шесть часов, двенадцать часов, раз в день), дают понятное описание периодичности обновления и предназначены для содержимого, которое изменяется сравнительно редко, наподобие информации о погоде, ежедневных предложений из магазинов (в таком случае используется время начала), или сведений о фазах луны. Для того, что требует более срочной доставки, наподобие напоминаний о встречах, сведений о пробках на дорогах, текущей информации о спортивных играх или о состоянии онлайнового аукциона, нужно использовать push-уведомления.
В дополнение, все эти обновления могут задействовать теги и срок действия, как и локальные обновлений. Единственная деталь заключается в том, что в любой заданный интервал опроса, веб-сервис может возвратить лишь один пакет с полезной информацией – отсюда необходимость в startPeriodicUpdateBatch. Тем не менее, если включена очередь оповещений и обновления с одного веб-сервиса содержат различные теги, динамическая плитка будет вести себя так же, как если бы эти обновления были отправлены локально: наиболее свежее обновление для каждого тега (до пяти) будет отображаться в общем цикле.
Подсказка. API периодических обновлений не предоставляет средств для авторизации на сервисе. Обычно это и не нужно, так как периодические обновления не разрабатываются для конкретного пользователя. Однако, вы можете включить в URI зашифрованные учетные данные, с помощью строки запроса. Так же вы можете использовать возможность Корпоративная аутентификация (Enterprise Authentication), если приложение исполняется на компьютере, входящем в домен.
Со стороны приложения ситуация с периодическими обновления показана в примере "Push-уведомления и периодические уведомления, клиентская часть" (http://code.msdn.microsoft.com/windowsapps/Push-and-periodic-de225603 ). В частности, посмотрите Сценарии 4 и 5, где представлены обычные средства для использования методов TileUpdater и BadgeUpdater с заданным URI сервиса, как я уже описывал. Несколько строк кода (взятых из js/scenario4.js) выглядят так:
var notifications = Windows.UI.Notifications;
var updater = notifications.TileUpdateManager.createTileUpdaterForApplication();
updater.enableNotificationQueue(true); updater.startPeriodicUpdate(urisToPoll[0], recurrence);
updater.startPeriodicUpdateBatch(urisToPoll, recurrence);
Настоящая работа по периодическим обновлениям, однако, проводится самим сервисом, который ответственен за то, чтобы возвращать подходящий XML, из которого Windows может создать обновление. Если даже мы можем запустить приложение-клиент, нам нужен и какой-то сервис, к которому мы можем делать запросы, и, к несчастью, Windows SDK не предоставляет нам его. Поэтому давайте сами исправим эту ситуацию с помощью собственного сервиса.
Так как вы, вероятно, используете пример приложения-клиента для экспериментов с вашим собственным сервисом обновлений, несмотря на это, вам следует сделать пару изменений, в частности, для очистки существующих обновлений в функциях, которое останавливает опрос. В js/scenario4.js, измените функцию stopTilePolling следующим образом:
function stopTilePolling() {
var updater = notifications.TileUpdateManager.createTileUpdaterForApplication();
updater.clear();
updater.stopPeriodicUpdate();
WinJS.log WinJS.log("Stopped polling.", "sample", "status");
}
Аналогично, измените stopBadgePolling в js/scenario5.js следующим образом:
function stopBadgePolling() {
var updater = notifications.BadgeUpdateManager.createBadgeUpdaterForApplication();
updater.clear();
updater.stopPeriodicUpdate();
WinJS.log WinJS.log("Stopped polling.", "sample", "status");
}
Без этих изменений, старые обновления будут присутствовать на плитке даже после того, как вы остановите обновления. Если вы затем измените свой веб-сервис, но у него будет ошибка в XML, вы не увидите никаких изменений на плитке и может думать, что обновление работает, в то время, как на самом деле это не так. Поверьте мне, выполнение этих небольших изменений упростит вашу жизнь!
Создание веб-сервиса для периодических обновления подразумевает создание веб-страницы, доступной по некоторому URI, единственная цель которой – отвечать на XmlHttpRequest отправкой XML –одержимого для объектов TileNotification или BadgeNotification. В идеале, такая страница так же обрабатывает параметры масштабирования, доступности и локализации, предоставленные в строке запроса, как описано ранее в разделе "Использование локальных изображений и изображений, полученных из веб"
Эта страница может быть реализована с использованием любого желаемого языка и инструмента, такого, как PHP или ASP.NET. На самом деле, если только вы не любите программировать в Блокноте, вам нужно использовать какой-нибудь хороший инструмент для веб-разработки. Visual Studio Express для Windows 8 не предназначен для подобных задач, в отличие от полной версии Visual Studio 2012. Так же вы можете взглянуть на Visual Studio Express 2012 для Web, как на другой вариант; подробнее об этом ниже. Если вы используете ASP.NET, напомню, что вы можете применить Notifications Extensions Library для упрощения создания XML для плитки.
Некоторые примеры страниц, которые предоставляют обновления для плиток даны в материале "Эффективное использование плиток (часть 2)" ( http://blogs.msdn.com/b/windowsappdev_ru/archive/2012/04/25/10297724.aspx) в блоге для разработчиков приложений для Windows 8. Основываясь на этих примерах, вот простая (но функциональная однострочная PHP-страница, которая отправляет XML для обновление для индикаторы событий, содержащее текущий день месяца:
<?php echo "<badge value='".date("j")."'/>"; ?>
Для того, чтобы она вернула нам XML подходящего формата, нам слудует так же включить заголовочный элемент, который так же участвует в работе:
<?php echo '<?xml version="1.0" encoding="utf-8"?>';
echo "<badge value='".date("j")."'/>"; ?>
Поместите этот код в .php-файл (смотрите HelloTiles/dayofmonthservice.php в дополнительных материалах) на любом веб-сервере, к которому у вас есть доступ, и – вуаля! Получился очень простой сервис, который доставляет обновления для индикатора событий. Вы можете использовать его в Сценарии 5 примера "Push-уведомления и периодические уведомления, клиентская часть" - введите URI вашей страницы в соответствующее поле, нажмите кнопку для начала выполнения запросов и затем проверьте плитку примера на Начальном экране. Через несколько секунд вы должны увидеть день месяца, который выглядит как индикатор событий. (Конечно, в этом сверхпростом примере дата отразит локальное время веб-сервера, а не время устройства, которые могут полностью различаться. Настоящий сервис должен различать часовой пояс и другие особенности расположения пользователя).
Совет. Обновления плиток и индикаторов событий очень чувствительны к правильно отформатированному XML. Если в вышеприведенный XML-код не включить закрывающий элемент / в код для badge, обновление не будет отображено. Для того, чтобы не было подобных тривиальных ошибок, и создана Notifications Extensions Library, по крайней мере, для ASP.NET. Надеюсь, что некоторые инициативные читатели могут обдумать подобный проект для PHP и других серверных языков.
Возвращаясь к материалу из блога для разработчиков приложений для Windows, упомянутому ранее, я хочу отметить, что пример на ASP.NET, который там дан, тот, что начинается с ). Razor/WebMatrix, вместе с инструментами, такими как Visual Studio Express 2012 для Web и другими дополнительными материалами, можно установить посредством веб-установщика (http://www.microsoft.com/web/downloads/platform.aspx ). Для того, чтобы познакомиться с Razor, который работает практически так же, как PHP, начните с материала "Пошаговое руководство. Создание веб-сайта с использованием синтаксиса Razor в Visual Studio" (http://msdn.microsoft.com/library/gg606533.aspx ).
Для того, чтобы вы смогли быстрее с этим разобраться, вот шаги, которые нужно выполнить в Visual Studio Express 2012 для Web для создания простого сервиса обновлений плиток на основе Razor-кода из вышеупомянутого сообщения блога:
@{
//
// Здесь может быть размещен любой другой код для получения динамического содержимого,
// необходимого для обновления плитки. Здесь мы лишь возвращаем статический XML
// для того, чтобы показать структуру сервиса.
//
var weekDay = DateTime.Now.DayOfWeek;
}
<?xml version="1.0" encoding="utf-8" ?>
<tile>
<visual lang="en-US">
<binding template="TileSquarePeekImageAndText02" branding="none">
<image id="1" src="http://www.kraigbrockschmidt.com/images/Liam07.png"/>
<text id="1">Liam--</text>
<text id="2">Giddy on the day he learned to sit up!</text>
</binding>
<binding template="TileWideSmallImageAndText04" branding="none">
<image id="1" src="http://www.kraigbrockschmidt.com/images/Liam08.png"/>
<text id="1">This is Liam</text>
<text id="2">Exploring the great outdoors!</text>
</binding>
</visual>
</tile>
![]() |
![]() |
Полный код этого веб-сайта вы можете найти в упражнении HelloTiles в дополнительных материалах к этой лекции. Так же просто, он предоставляет базовый фреймворк, в который вы можете добавить код для создания более динамичных результатов. В верхней части файла, внутри блока @{ }, вы можете писать любой необходимый код на C#.
Вообще говоря, реальный сервис, который предоставляет обновления плиток и индикаторов событий, возможно, будет соединен на серверной стороне с каким-то более полезным источником информации, возможно, с постоянно выполняющимся процессом, который может отслеживать состояние других сайтов, извлекать необходимые данные и создавать обновления. Эти обновления могут быть возвращены в ответе страницы, как мы видели здесь, или переданы WNS и переданы напрямую конкретному клиенту. Скоро мы вернемся к этой теме в разделе "Push-уведомления и Windows Push Notification Service".
На данный момент, более актуален вопрос о том, как отлаживать такие сервисы? К счастью, инструменты Visual Studio упрощают эту задачу с применением локального хоста (localhost).
Отладка сервиса обновления плиток и индикаторов событий с помощью периодических обновлений может быть трудным делом. Вы можете просто пройти по URI вашего сервиса в браузере и использовать команду Просмотреть код (View Source) для того, чтобы проверить XML, но как вам пошагово исполнить серверный код для того, чтобы обнаружить проблемы?
Решение заключается в запуске сервиса на вашем локальном компьютере, как мы только что делали в предыдущем разделе, где URI ссылается на сервер, работающий на локальном хосте, следовательно, вам нужно его настроить. Вы можете, конечно, установить сервер наподобие Apache, или вы можете использовать решение, которое встроено в Windows и интегрировано с Visual Studio: Internet Information Services (IIS).
Для того, чтобы включить IIS в Windows, пройдите по пути Панель управления > Программы и компоненты > Включение или отключение компонентов Windows (Control Panel > Turn Windows Features On Or Off), установите флаг Службы IIS (Internet Information Services) в верхней части, для установки ключевых возможностей, как показано ниже:
Как только IIS будет установлен, локальные сайты, адресуемые с помощью http://localhost/ будут находиться в папке c:\inetpub\wwwroot. Это место, куда вы можете поместить что-то вроде PHP-страницы, описанной ранее, и вы сможете использовать URI наподобие http://localhost/dayofmonthservice.php в примере "Push-уведомления и периодические уведомления, клиентская часть" (в данном случае – Сценарий 5, для обновления индикатора событий).
В случае с веб-страницей, выполняющейся на локальном компьютере, вы можете подключиться к ней с помощью любого имеющегося у вас инструмента для серверной отладки. Здесь полезно знать, что доступ к URI локального хоста, так же известный как локальная обратная петля или замыкание на себя (local loopback), обычно блокируется для приложений для Магазина Windows, только если вы не работаете а компьютере с лицензией разработчика, которая у вас есть, если вы запускаете Visual Studio или Blend. Однако, для компьютеров ваших пользователей это условие не выполняется! На самом деле, Магазин Windows не примет приложения, которые пытаются это сделать .
Для того, чтобы использовать PHP с IIS, вам может понадобиться установить его с помощью Веб-инсталлятора Microsoft (http://www.microsoft.com/web/downloads/platform.aspx ), или серверный код не сможет работать. После установки PHP попробуйте ввести URI для PHP-страницы в вашем браузере. Если вы получите сообщение об ошибке, которог сообщает "Handler PHP53_via_FastCGI has a bad module" (Неверный модуль обработчика PHP53_via_FastCGI" (да, полезное сообщение!), вернитесь к диалоговому окну Включение или отключение компонентов Windows, которое описано выше, перейдите в раздел Службы IIS > Службы Интернета > Компоненты разработки приложений (Internet Information Services > World Wide Web Services > Application Development Features). установите флаг для CGI, и нажмите OK. Как только подсистема CGI будет установлена, ваша PHP-страница должна заработать.
Если вы планируете работать в ASP.NET или Razor, я настоятельно рекомендую вам установить Visual Studio Express 2012 для Web с помощью веб-установщика. Когда вы запустите веб-сайт в его отладчике, он назначит локальному хосту порт, наподобие http://localhost:53528 и запустит Internet Explorer с заданным URI. Заданный порт связывает браузер с отладчиком, таким образом, если вы установите в коде страницы точку останова, отладчик остановится в данной точке, когда к странице поступает запрос, что позволяет вам пошагово исполнять код с использованием тех же возможностей, которыми мы наслаждаемся, создавая код приложения для Магазина Windows.
Например, загрузите сайт из упражнения HelloTiles в Visual Studio Express 2012 для Web, установите точку останова на переменную weekDay в верхней части кода, и начните отладку. Как только Internet Explorer загрузит default.cshtml, скопируйте и вставьте ее URI в Сценарий 4 примера "Push-уведомления и периодические уведомления, клиентская часть". Нажмите кнопку Stop Periodic Updates (Остановить периодические обновления) затем – кнопку Start periodic updates (Начать периодические обновления) для того. чтобы инициировать новый запрос к URI, и – волшебство! – сработает точка останова на странице сервиса:
Когда вы готовы к отправке приложения в Магазин Windows и имеются реальные пользовател вашего веб-сервиса, вам нужно решить, где вы разместите этот сервис, чтобы он был масштабируемым для того, чтобы, хочется надеяться, работать с большой базой пользователей! В процессе разработки и тестирования, конечно, вы можете разместить сервис везде, где хотите, так как несколько экземпляров вашего приложения вряд ли слишком его нагрузят. Но если ваше приложение будет установлено множеством пользователей и каждый из экземпляров приложения начнет запрашивать у сервера обновления для плиток и индикаторов событий, этот хост-сервер может оказаться перегруженным запросами!
По этой причине вам следует обратить внимание на сервисы, наподобие Windows Azure, где, при необходимости, можно добавить дополнительные серверные мощности, и уменьшить их, когда это не нужно (и платите вы только за то, что реально используете). Для того, чтобы начать, посетите ресурс http://www.windowsazure.com , где вы можете воспользоваться 90-дневным пробным периодом для размещения сайтов. Сайт Windows Azure так же предоставляет непосредственную поддержку и SDK для.NET, node.js, PHP, Java, и Python,вместе с Visual Studio Express 2012 с Web-SDK для Windows Azure—все это доступно, опять же, через платформу веб-установки. так же вас может заинтересовать Windows Azure Toolkit, который предоставляет шаблоны проектов, примеры, и другие ресурсы для создания сервисов на базе Windows Azure.
Совет. На момент написания этого материала, Windows Azure поддерживает .NET Framework 4.0, но не .NET Framework 4.5, поэтому не забудьте проверить целевой фреймворк в настройках построения (Buid) вашего проекта перед его размещением. Щелкните правой кнопкой по проекту в Visual Studio Web, выберите страницу свойств, щелкните Build (Построение) смотрите рисунок ниже). Когда я разместил мой сервис, рассчитанный на версию 4.5, страницы наподобие Default.cshtml выдают ошибки.
В качестве краткого руководства, которое поможет вам начать работу, я начал мой пробный период в Windows Azure, установит Windows Azure SDK для .NET, и разместил сервис HelloTiles из нашего упражнения, выполнив следующие шаги, последовательность которых вы можете повтороить:
Теперь, имея все это, вы можете масштабировать ваш хостинг Windows Azure hosting для поддержки нужд приложения по размещению URI для API периодических обновлений. Это так же дает вам хорошую основу для использования push-уведомлений, как мы увидим позже, но так как это часто используется и со всплывающими уведомлениями, сейчас мы взглянем на то, как они работают.
До сих пор в этой лекции мы занимались вопросами плиток и обновлений, что, на самом деле, является отличным вступлением для нашей следующей темы – всплывающих уведомлений. Это потому что процесс создания и отправки всплывающих уведомлений весьма похож на то, что мы выполняли для плиток, и даже проще, так как для них нет периодических уведомлений. Они исходят либо из выполняющегося приложения, либо от фоновых задач, либо из push-уведомлений, как мы увидим в разделе "Push-уведомления и Windows Push Notification Service" ниже. К счастью, тема всплывающих уведомлений гораздо короче, чем тема плиток. Вот основные аспекты, касающиеся всплывающих уведомлений:
show и addToSchedule , соответтсвенно, для немедленного и запланированного показа. Класс ToastNotifier так же предоставляет методы для управления ранее запланированными уведомлениями.
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 для уведомлений с использованием шаблона, полученного из ), с применением Notifications Extensions Library, или из XML-строк. Полученный XmlDocument затем используется для создания объекта ToastNotification который, в свою очередь, передается методу ToastNotifier.show.
Например, вот как Сценарий 1 (js/scenario1.js) отправляет всплывающее уведомление с использованием шаблона )) с помощью 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);
}
Помимо свойств, которые вы можете назначить при создании объекта ):
visual и binding в XML могут иметь атрибуты branding и addImageQuery , которые работают так же, как их аналоги для плиток. Обратитесь к разделам о плитках, которые мы рассмотрели выше. Элемент image так же поддерживает addImageQuery для настроек масштабирования, языка и контрастности.visual, binding, и text поддерживают атрибут lang для идентификации языка текущего приложения.Элемент ), с помощью которого вы можете добавить к уведомлению звуки, при условии, тчо пользователь не отключил все звуки уведомлений в разделе Параметры ПК > Уведомления (PC Settings > Notifications). (смотрите рис 4.8) Конкретный звук устанавливается с помощью атрибута src и должен быть представлен одним из следующих строковых значений, как описано в материале "Каталог параметров звука для всплывающих уведомлений" (http://msdn.microsoft.com/library/windows/apps/Hh761492.aspx ) :
В свою очередь, атрибут 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, но еще одно средство – это запланированные всплывающие уведомления, которые просто появляются в некоторое время, независимо от того, исполняется ли приложение. Это отличный способ предложить пользователям запустить вашу программу снова.
Запланированные всплывающие уведомления создают с использованием ) вместо обычного 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 ). Он вернет вектор объектов ). Использование этих методов показано в Сценарии 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 не поддерживает эти события, так как предполагается, что приложение, вероятно, не будет исполняться во время вызова такого всплывающего уведомления.
Периодические обновления – это отличное доказательство того, что Microsoft по-настоящему прислушивается к мнению разработчиков. Когда была выпущена Developer Preview Windows 8, в Сентябре 2011, многие разработчики были сильно заинтересованы в реализации динамических плиток, но это могло быть реализованы лишь с помощью push-уведомлений и Windows Push Notification Service, даже если плитку нужно было обновлять не слишком часто. Другими словами, push-уведомления – это избыточно для приложений, которым каждый раз лишь нужно получить немного данных из веб-сервиса для создания обновления. Разработчики спрашивали: "Возможно ли, чтобы мое приложение исполнялось в фоновом режиме, периодически запрашивало данные с моего сервиса и затем выполняло обновление плиток и индикаторов событий?".
Это был совершенно справедливый вопрос, но, как описано выше, фоновые задачи очень тщательно контролируются и они разрешены только для специальных сценариев. Услышав этот вопрос, команда Microsoft, которая занимается плитками и уведомлениями, изучила проблему и обнаружила, что создание нового класса фоновых задач для подобных целей – это избыточно для низкочастотных обновлений плиток. Более того, они обнаружили, что даже если приложение может использовать фоновую задачу для этих целей, все они будут выполнять примерно одно и то же: получать данные с сервиса и заполнять шаблон плитки или индикатора событий. Поэтому, вместо добавления новой фоновой задачи, они добавили новый API для периодических обновлений, управляемых системой.
Этот API состоит из следующих методов классов TileUpdater (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.tileupdater.aspx ) и BadgeUpdater (http://msdn.microsoft.com/library/windows/apps/windows.ui.notifications.badgeupdater.aspx ):
TileUpdater.startPeriodicUpdate и BadgeUpdater.startPeriodicUpdate Выполняют настройку Windows на запрос обновления с заданного URI с указанной периодичностью (смотрите ниже). Эти вызовы удаляют любые URI ранее зарегистрированные для плитки. Приложение может задать необязательные дату и время, когда должны начаться регулярные обновления, и во всех случаях первый запрос происходит немедленно (очень полезно для отладки). Подходящее время для этих вызовов – старт приложения, возобновление приложения, и когда изменяются настройки, которые могут вызывать необходимость смены URI.TileUpdater.stopPeriodicUpdate и BadgeUpdater.stopPeriodicUpdate Останавливает текущий процесс периодических обновлений, но не очищает существующие обновления плитки.TileUpdater.startPeriodicUpdateBatch Используется лишь для обновления плитки, идентичен startPeriodicUpdate , но принимает массив размером до 5 URI, автоматически создавая очередь обновлений с результатами (заменяя предыдущие URI). Отметим, что TileUpdater.enableNotificationQueue должен быть установлен в true перед использованием этого метода, как описано выше, в разделе "Циклические и запланированные обновления, обновления со сроком действия"Во всех этих случаях каждый из URI представлен объектом ), а периодичность опроса является значением перечисления ). Значения этого перечисления – halfHour, hour, sixHours, twelveHours, и daily (полчаса, час, шесть часов, двенадцать часов, раз в день), дают понятное описание периодичности обновления и предназначены для содержимого, которое изменяется сравнительно редко, наподобие информации о погоде, ежедневных предложений из магазинов (в таком случае используется время начала), или сведений о фазах луны. Для того, что требует более срочной доставки, наподобие напоминаний о встречах, сведений о пробках на дорогах, текущей информации о спортивных играх или о состоянии онлайнового аукциона, нужно использовать push-уведомления.
В дополнение, все эти обновления могут задействовать теги и срок действия, как и локальные обновлений. Единственная деталь заключается в том, что в любой заданный интервал опроса, веб-сервис может возвратить лишь один пакет с полезной информацией – отсюда необходимость в startPeriodicUpdateBatch. Тем не менее, если включена очередь оповещений и обновления с одного веб-сервиса содержат различные теги, динамическая плитка будет вести себя так же, как если бы эти обновления были отправлены локально: наиболее свежее обновление для каждого тега (до пяти) будет отображаться в общем цикле.
Подсказка. API периодических обновлений не предоставляет средств для авторизации на сервисе. Обычно это и не нужно, так как периодические обновления не разрабатываются для конкретного пользователя. Однако, вы можете включить в URI зашифрованные учетные данные, с помощью строки запроса. Так же вы можете использовать возможность Корпоративная аутентификация (Enterprise Authentication), если приложение исполняется на компьютере, входящем в домен.
Со стороны приложения ситуация с периодическими обновления показана в примере "Push-уведомления и периодические уведомления, клиентская часть" (http://code.msdn.microsoft.com/windowsapps/Push-and-periodic-de225603 ). В частности, посмотрите Сценарии 4 и 5, где представлены обычные средства для использования методов TileUpdater и BadgeUpdater с заданным URI сервиса, как я уже описывал. Несколько строк кода (взятых из js/scenario4.js) выглядят так:
var notifications = Windows.UI.Notifications;
var updater = notifications.TileUpdateManager.createTileUpdaterForApplication();
updater.enableNotificationQueue(true); updater.startPeriodicUpdate(urisToPoll[0], recurrence);
updater.startPeriodicUpdateBatch(urisToPoll, recurrence);
Настоящая работа по периодическим обновлениям, однако, проводится самим сервисом, который ответственен за то, чтобы возвращать подходящий XML, из которого Windows может создать обновление. Если даже мы можем запустить приложение-клиент, нам нужен и какой-то сервис, к которому мы можем делать запросы, и, к несчастью, Windows SDK не предоставляет нам его. Поэтому давайте сами исправим эту ситуацию с помощью собственного сервиса.
Так как вы, вероятно, используете пример приложения-клиента для экспериментов с вашим собственным сервисом обновлений, несмотря на это, вам следует сделать пару изменений, в частности, для очистки существующих обновлений в функциях, которое останавливает опрос. В js/scenario4.js, измените функцию stopTilePolling следующим образом:
function stopTilePolling() {
var updater = notifications.TileUpdateManager.createTileUpdaterForApplication();
updater.clear();
updater.stopPeriodicUpdate();
WinJS.log WinJS.log("Stopped polling.", "sample", "status");
}
Аналогично, измените stopBadgePolling в js/scenario5.js следующим образом:
function stopBadgePolling() {
var updater = notifications.BadgeUpdateManager.createBadgeUpdaterForApplication();
updater.clear();
updater.stopPeriodicUpdate();
WinJS.log WinJS.log("Stopped polling.", "sample", "status");
}
Без этих изменений, старые обновления будут присутствовать на плитке даже после того, как вы остановите обновления. Если вы затем измените свой веб-сервис, но у него будет ошибка в XML, вы не увидите никаких изменений на плитке и может думать, что обновление работает, в то время, как на самом деле это не так. Поверьте мне, выполнение этих небольших изменений упростит вашу жизнь!
Создание веб-сервиса для периодических обновления подразумевает создание веб-страницы, доступной по некоторому URI, единственная цель которой – отвечать на XmlHttpRequest отправкой XML –одержимого для объектов TileNotification или BadgeNotification. В идеале, такая страница так же обрабатывает параметры масштабирования, доступности и локализации, предоставленные в строке запроса, как описано ранее в разделе "Использование локальных изображений и изображений, полученных из веб"
Эта страница может быть реализована с использованием любого желаемого языка и инструмента, такого, как PHP или ASP.NET. На самом деле, если только вы не любите программировать в Блокноте, вам нужно использовать какой-нибудь хороший инструмент для веб-разработки. Visual Studio Express для Windows 8 не предназначен для подобных задач, в отличие от полной версии Visual Studio 2012. Так же вы можете взглянуть на Visual Studio Express 2012 для Web, как на другой вариант; подробнее об этом ниже. Если вы используете ASP.NET, напомню, что вы можете применить Notifications Extensions Library для упрощения создания XML для плитки.
Некоторые примеры страниц, которые предоставляют обновления для плиток даны в материале "Эффективное использование плиток (часть 2)" ( http://blogs.msdn.com/b/windowsappdev_ru/archive/2012/04/25/10297724.aspx) в блоге для разработчиков приложений для Windows 8. Основываясь на этих примерах, вот простая (но функциональная однострочная PHP-страница, которая отправляет XML для обновление для индикаторы событий, содержащее текущий день месяца:
<?php echo "<badge value='".date("j")."'/>"; ?>
Для того, чтобы она вернула нам XML подходящего формата, нам слудует так же включить заголовочный элемент, который так же участвует в работе:
<?php echo '<?xml version="1.0" encoding="utf-8"?>';
echo "<badge value='".date("j")."'/>"; ?>
Поместите этот код в .php-файл (смотрите HelloTiles/dayofmonthservice.php в дополнительных материалах) на любом веб-сервере, к которому у вас есть доступ, и – вуаля! Получился очень простой сервис, который доставляет обновления для индикатора событий. Вы можете использовать его в Сценарии 5 примера "Push-уведомления и периодические уведомления, клиентская часть" - введите URI вашей страницы в соответствующее поле, нажмите кнопку для начала выполнения запросов и затем проверьте плитку примера на Начальном экране. Через несколько секунд вы должны увидеть день месяца, который выглядит как индикатор событий. (Конечно, в этом сверхпростом примере дата отразит локальное время веб-сервера, а не время устройства, которые могут полностью различаться. Настоящий сервис должен различать часовой пояс и другие особенности расположения пользователя).
Совет. Обновления плиток и индикаторов событий очень чувствительны к правильно отформатированному XML. Если в вышеприведенный XML-код не включить закрывающий элемент / в код для badge, обновление не будет отображено. Для того, чтобы не было подобных тривиальных ошибок, и создана Notifications Extensions Library, по крайней мере, для ASP.NET. Надеюсь, что некоторые инициативные читатели могут обдумать подобный проект для PHP и других серверных языков.
Возвращаясь к материалу из блога для разработчиков приложений для Windows, упомянутому ранее, я хочу отметить, что пример на ASP.NET, который там дан, тот, что начинается с ). Razor/WebMatrix, вместе с инструментами, такими как Visual Studio Express 2012 для Web и другими дополнительными материалами, можно установить посредством веб-установщика (http://www.microsoft.com/web/downloads/platform.aspx ). Для того, чтобы познакомиться с Razor, который работает практически так же, как PHP, начните с материала "Пошаговое руководство. Создание веб-сайта с использованием синтаксиса Razor в Visual Studio" (http://msdn.microsoft.com/library/gg606533.aspx ).
Для того, чтобы вы смогли быстрее с этим разобраться, вот шаги, которые нужно выполнить в Visual Studio Express 2012 для Web для создания простого сервиса обновлений плиток на основе Razor-кода из вышеупомянутого сообщения блога:
@{
//
// Здесь может быть размещен любой другой код для получения динамического содержимого,
// необходимого для обновления плитки. Здесь мы лишь возвращаем статический XML
// для того, чтобы показать структуру сервиса.
//
var weekDay = DateTime.Now.DayOfWeek;
}
<?xml version="1.0" encoding="utf-8" ?>
<tile>
<visual lang="en-US">
<binding template="TileSquarePeekImageAndText02" branding="none">
<image id="1" src="http://www.kraigbrockschmidt.com/images/Liam07.png"/>
<text id="1">Liam--</text>
<text id="2">Giddy on the day he learned to sit up!</text>
</binding>
<binding template="TileWideSmallImageAndText04" branding="none">
<image id="1" src="http://www.kraigbrockschmidt.com/images/Liam08.png"/>
<text id="1">This is Liam</text>
<text id="2">Exploring the great outdoors!</text>
</binding>
</visual>
</tile>
![]() |
![]() |
Полный код этого веб-сайта вы можете найти в упражнении HelloTiles в дополнительных материалах к этой лекции. Так же просто, он предоставляет базовый фреймворк, в который вы можете добавить код для создания более динамичных результатов. В верхней части файла, внутри блока @{ }, вы можете писать любой необходимый код на C#.
Вообще говоря, реальный сервис, который предоставляет обновления плиток и индикаторов событий, возможно, будет соединен на серверной стороне с каким-то более полезным источником информации, возможно, с постоянно выполняющимся процессом, который может отслеживать состояние других сайтов, извлекать необходимые данные и создавать обновления. Эти обновления могут быть возвращены в ответе страницы, как мы видели здесь, или переданы WNS и переданы напрямую конкретному клиенту. Скоро мы вернемся к этой теме в разделе "Push-уведомления и Windows Push Notification Service".
На данный момент, более актуален вопрос о том, как отлаживать такие сервисы? К счастью, инструменты Visual Studio упрощают эту задачу с применением локального хоста (localhost).
Отладка сервиса обновления плиток и индикаторов событий с помощью периодических обновлений может быть трудным делом. Вы можете просто пройти по URI вашего сервиса в браузере и использовать команду Просмотреть код (View Source) для того, чтобы проверить XML, но как вам пошагово исполнить серверный код для того, чтобы обнаружить проблемы?
Решение заключается в запуске сервиса на вашем локальном компьютере, как мы только что делали в предыдущем разделе, где URI ссылается на сервер, работающий на локальном хосте, следовательно, вам нужно его настроить. Вы можете, конечно, установить сервер наподобие Apache, или вы можете использовать решение, которое встроено в Windows и интегрировано с Visual Studio: Internet Information Services (IIS).
Для того, чтобы включить IIS в Windows, пройдите по пути Панель управления > Программы и компоненты > Включение или отключение компонентов Windows (Control Panel > Turn Windows Features On Or Off), установите флаг Службы IIS (Internet Information Services) в верхней части, для установки ключевых возможностей, как показано ниже:
Как только IIS будет установлен, локальные сайты, адресуемые с помощью http://localhost/ будут находиться в папке c:\inetpub\wwwroot. Это место, куда вы можете поместить что-то вроде PHP-страницы, описанной ранее, и вы сможете использовать URI наподобие http://localhost/dayofmonthservice.php в примере "Push-уведомления и периодические уведомления, клиентская часть" (в данном случае – Сценарий 5, для обновления индикатора событий).
В случае с веб-страницей, выполняющейся на локальном компьютере, вы можете подключиться к ней с помощью любого имеющегося у вас инструмента для серверной отладки. Здесь полезно знать, что доступ к URI локального хоста, так же известный как локальная обратная петля или замыкание на себя (local loopback), обычно блокируется для приложений для Магазина Windows, только если вы не работаете а компьютере с лицензией разработчика, которая у вас есть, если вы запускаете Visual Studio или Blend. Однако, для компьютеров ваших пользователей это условие не выполняется! На самом деле, Магазин Windows не примет приложения, которые пытаются это сделать .
Для того, чтобы использовать PHP с IIS, вам может понадобиться установить его с помощью Веб-инсталлятора Microsoft (http://www.microsoft.com/web/downloads/platform.aspx ), или серверный код не сможет работать. После установки PHP попробуйте ввести URI для PHP-страницы в вашем браузере. Если вы получите сообщение об ошибке, которог сообщает "Handler PHP53_via_FastCGI has a bad module" (Неверный модуль обработчика PHP53_via_FastCGI" (да, полезное сообщение!), вернитесь к диалоговому окну Включение или отключение компонентов Windows, которое описано выше, перейдите в раздел Службы IIS > Службы Интернета > Компоненты разработки приложений (Internet Information Services > World Wide Web Services > Application Development Features). установите флаг для CGI, и нажмите OK. Как только подсистема CGI будет установлена, ваша PHP-страница должна заработать.
Если вы планируете работать в ASP.NET или Razor, я настоятельно рекомендую вам установить Visual Studio Express 2012 для Web с помощью веб-установщика. Когда вы запустите веб-сайт в его отладчике, он назначит локальному хосту порт, наподобие http://localhost:53528 и запустит Internet Explorer с заданным URI. Заданный порт связывает браузер с отладчиком, таким образом, если вы установите в коде страницы точку останова, отладчик остановится в данной точке, когда к странице поступает запрос, что позволяет вам пошагово исполнять код с использованием тех же возможностей, которыми мы наслаждаемся, создавая код приложения для Магазина Windows.
Например, загрузите сайт из упражнения HelloTiles в Visual Studio Express 2012 для Web, установите точку останова на переменную weekDay в верхней части кода, и начните отладку. Как только Internet Explorer загрузит default.cshtml, скопируйте и вставьте ее URI в Сценарий 4 примера "Push-уведомления и периодические уведомления, клиентская часть". Нажмите кнопку Stop Periodic Updates (Остановить периодические обновления) затем – кнопку Start periodic updates (Начать периодические обновления) для того. чтобы инициировать новый запрос к URI, и – волшебство! – сработает точка останова на странице сервиса:
Когда вы готовы к отправке приложения в Магазин Windows и имеются реальные пользовател вашего веб-сервиса, вам нужно решить, где вы разместите этот сервис, чтобы он был масштабируемым для того, чтобы, хочется надеяться, работать с большой базой пользователей! В процессе разработки и тестирования, конечно, вы можете разместить сервис везде, где хотите, так как несколько экземпляров вашего приложения вряд ли слишком его нагрузят. Но если ваше приложение будет установлено множеством пользователей и каждый из экземпляров приложения начнет запрашивать у сервера обновления для плиток и индикаторов событий, этот хост-сервер может оказаться перегруженным запросами!
По этой причине вам следует обратить внимание на сервисы, наподобие Windows Azure, где, при необходимости, можно добавить дополнительные серверные мощности, и уменьшить их, когда это не нужно (и платите вы только за то, что реально используете). Для того, чтобы начать, посетите ресурс http://www.windowsazure.com , где вы можете воспользоваться 90-дневным пробным периодом для размещения сайтов. Сайт Windows Azure так же предоставляет непосредственную поддержку и SDK для.NET, node.js, PHP, Java, и Python,вместе с Visual Studio Express 2012 с Web-SDK для Windows Azure—все это доступно, опять же, через платформу веб-установки. так же вас может заинтересовать Windows Azure Toolkit, который предоставляет шаблоны проектов, примеры, и другие ресурсы для создания сервисов на базе Windows Azure.
Совет. На момент написания этого материала, Windows Azure поддерживает .NET Framework 4.0, но не .NET Framework 4.5, поэтому не забудьте проверить целевой фреймворк в настройках построения (Buid) вашего проекта перед его размещением. Щелкните правой кнопкой по проекту в Visual Studio Web, выберите страницу свойств, щелкните Build (Построение) смотрите рисунок ниже). Когда я разместил мой сервис, рассчитанный на версию 4.5, страницы наподобие Default.cshtml выдают ошибки.
В качестве краткого руководства, которое поможет вам начать работу, я начал мой пробный период в Windows Azure, установит Windows Azure SDK для .NET, и разместил сервис HelloTiles из нашего упражнения, выполнив следующие шаги, последовательность которых вы можете повтороить:
Теперь, имея все это, вы можете масштабировать ваш хостинг Windows Azure hosting для поддержки нужд приложения по размещению URI для API периодических обновлений. Это так же дает вам хорошую основу для использования push-уведомлений, как мы увидим позже, но так как это часто используется и со всплывающими уведомлениями, сейчас мы взглянем на то, как они работают.
До сих пор в этой лекции мы занимались вопросами плиток и обновлений, что, на самом деле, является отличным вступлением для нашей следующей темы – всплывающих уведомлений. Это потому что процесс создания и отправки всплывающих уведомлений весьма похож на то, что мы выполняли для плиток, и даже проще, так как для них нет периодических уведомлений. Они исходят либо из выполняющегося приложения, либо от фоновых задач, либо из push-уведомлений, как мы увидим в разделе "Push-уведомления и Windows Push Notification Service" ниже. К счастью, тема всплывающих уведомлений гораздо короче, чем тема плиток. Вот основные аспекты, касающиеся всплывающих уведомлений:
show и addToSchedule , соответтсвенно, для немедленного и запланированного показа. Класс ToastNotifier так же предоставляет методы для управления ранее запланированными уведомлениями.
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 для уведомлений с использованием шаблона, полученного из ), с применением Notifications Extensions Library, или из XML-строк. Полученный XmlDocument затем используется для создания объекта ToastNotification который, в свою очередь, передается методу ToastNotifier.show.
Например, вот как Сценарий 1 (js/scenario1.js) отправляет всплывающее уведомление с использованием шаблона )) с помощью 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);
}
Помимо свойств, которые вы можете назначить при создании объекта ):
visual и binding в XML могут иметь атрибуты branding и addImageQuery , которые работают так же, как их аналоги для плиток. Обратитесь к разделам о плитках, которые мы рассмотрели выше. Элемент image так же поддерживает addImageQuery для настроек масштабирования, языка и контрастности.visual, binding, и text поддерживают атрибут lang для идентификации языка текущего приложения.Элемент ), с помощью которого вы можете добавить к уведомлению звуки, при условии, тчо пользователь не отключил все звуки уведомлений в разделе Параметры ПК > Уведомления (PC Settings > Notifications). (смотрите рис 4.8) Конкретный звук устанавливается с помощью атрибута src и должен быть представлен одним из следующих строковых значений, как описано в материале "Каталог параметров звука для всплывающих уведомлений" (http://msdn.microsoft.com/library/windows/apps/Hh761492.aspx ) :
В свою очередь, атрибут 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, но еще одно средство – это запланированные всплывающие уведомления, которые просто появляются в некоторое время, независимо от того, исполняется ли приложение. Это отличный способ предложить пользователям запустить вашу программу снова.
Запланированные всплывающие уведомления создают с использованием ) вместо обычного 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 ). Он вернет вектор объектов ). Использование этих методов показано в Сценарии 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 не поддерживает эти события, так как предполагается, что приложение, вероятно, не будет исполняться во время вызова такого всплывающего уведомления.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.