Статьи

WinRT: пример использования периодических уведомлений для живых плиток

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

Ниже приведен пример кода, который показывает, как использовать очередь уведомлений в приложении Windows 8 Metro и как периодически обновлять очередь с помощью серверной части ASP.NET Web Api.

Исходный код для следующих примеров доступен на GitHub.

TileUpdater

TileUpdater-class — это ключ к обновлению ваших плиток. Это позволяет обновлять живую плитку приложения Metro как вручную, так и автоматически. Вы можете получить экземпляр TileUpdater, используя следующий код:

 

var tileUpdater = TileUpdateManager.CreateTileUpdaterForApplication();

Затем, используя экземпляр TileUpdater, вы обычно вызываете один из следующих методов:

В следующих сценариях показано, как использовать методы Update и StartPeriodicUpdateBatch.

Идентификатор уведомления

При включенной очереди уведомлений приложение может отображать до пяти уведомлений в своей ячейке. Когда новое уведомление добавляется в очередь, оно заменяет старое уведомление. Но возможно добавить идентификатор (пометить) уведомление.

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

Время истечения уведомления

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

Если содержание вашего уведомления имеет существенно различную полезную продолжительность жизни — короче или дольше — вы можете явно установить время истечения для каждого уведомления, и это лучший способ. Это предотвращает устаревание или нерелевантный контент в очереди.

Сценарий 1. Обновление очереди уведомлений при каждом запуске приложения.

Если достаточно, чтобы очередь уведомлений на плитке обновлялась только при запуске приложения , бэкэнд не нужен. Вы можете обновить живую плитку, например, в методе OnNavigateTo MainPage.

Шаг 1. Включите очередь уведомлений для вашей живой плитки

Если вы не включите очередь уведомлений, последнее уведомление переопределит предыдущее. Так что на вашей плитке можно показать только одно уведомление.

TileUpdateManager.CreateTileUpdaterForApplication().EnableNotificationQueue(true);

Шаг 2: Создайте плитки и уведомления

После того, как вы включили очередь уведомлений, вы создаете плитку для каждого уведомления и используете TileUpdateManager, чтобы добавить ее в очередь. В следующем примере кода метод Generator.Generate возвращает правильный XML как для широкой, так и для маленькой плитки. Идентификатор и срок действия устанавливаются:

for (var i = 0; i < 5; i++)
            {
                var tileTitle = string.Format("Local Notification {0}", i);
                var tilesSubtitle = DateTime.UtcNow.AddHours(i);
                var myTile = Generator.Generate(tileTitle, tilesSubtitle);
 
                var notification = new TileNotification(myTile.ToXmlDoc()) { ExpirationTime = tilesSubtitle.AddMinutes(15), Tag = i.ToString()};
 
                TileUpdateManager.CreateTileUpdaterForApplication().Update(notification);
            }

Сценарий 2. Периодическое обновление очереди уведомлений.

В случае, когда живая плитка должна автоматически обновляться новыми уведомлениями, необходимо создать бэкэнд. Ваш бэкэнд вернет тот же XML, что и локальные обновления плитки. Что может быть немного странным, так это то, что ваш сервер не вернет все уведомления одновременно.

Например, если вы хотите отобразить 5 самых последних новостей на своей плитке, ваше приложение будет вызывать ваш бэкэнд пять раз, и каждый раз он будет возвращать другой элемент. Вероятно, самый простой способ справиться с этим — дать приложению пять разных URL. Каждый URL содержит свой параметр, который запускает сервер, чтобы вернуть правильный элемент.

Шаг 1. Создайте серверную часть с помощью сервера ASP.NET Web Api.

Возможно, самый простой способ создать собственный бэкэнд для вашего приложения — это использовать самодостаточную программу ASP.NET Web Api . Просто убедитесь, что он возвращает XML, а не JSON .

 Вот контроллер Web Api, который используется для создания точно таких же уведомлений, которые были созданы на шаге 1:

public class TileUpdaterController : ApiController
    {
        public HttpResponseMessage Get(int position)
        {
            var msg = string.Format("Received request for position {0}", position);
            Console.WriteLine(msg);
 
            var tileTitle = string.Format("Backend Noti {0}", position);
            var tilesSubtitle = DateTime.UtcNow.AddHours(position);
 
            var result = Generator.Generate(tileTitle, tilesSubtitle);
 
            var response = Request.CreateResponse(HttpStatusCode.OK, result);
            response.Headers.Add("X-WNS-Expires", tilesSubtitle.AddMinutes(15).ToString("r"));
            response.Headers.Add("X-WNS-Tag", position.ToString());
 
            return response;
        }
    }
  • Заголовок ответа X-WNS-Expires можно использовать для установки времени истечения уведомления
  • Заголовок ответа X-WNS-Tag можно использовать для установки идентификатора уведомления

Шаг 2. Запустите периодические обновления для вашего приложения.

Когда бэкэнд будет готов, можно использовать StartPeriodicUpdateBatch TileUpdater для подключения вашего приложения к бэкенду. OnNavigateTo в MainPage снова является хорошим местом для вызова TileUpdater.

var uris = new List<Uri>();
const string baseUri = "http://localhost:8080/api/tileupdater/get?position=";
 
for (var i = 0; i < 5; i++)
{
    uris.Add(new Uri(baseUri + i, UriKind.Absolute));
}
 
TileUpdateManager.CreateTileUpdaterForApplication().StartPeriodicUpdateBatch(uris,
                                                                             PeriodicUpdateRecurrence.HalfHour);

 

Шаг 3: Включите очередь уведомлений для вашей живой плитки

Как и в случае локальных обновлений, приложение должно включить очередь уведомлений для приложения.

Сценарий 3. Обновление очереди уведомлений при каждом запуске приложения, а также периодически

Учитывая следующий сценарий:

  • Очередь уведомлений должна обновляться при каждом запуске приложения.
  • Очередь уведомлений должна периодически обновляться путем вызова бэкэнда.

В подобном сценарии достаточно вызвать метод StartPeriodicUpdateBatch при запуске приложения. Когда вы вызываете этот метод, он запускает обновления и (на основе Fiddler) немедленно вызывает бэкэнд и обновляет плитки. Нет необходимости вызывать метод обновления TileUpdater, поэтому здесь можно применить тот же код, что и в сценарии 2.

Очередь уведомлений и симулятор Windows 8

Очередь уведомлений не работает, если приложение запускается в симуляторе Windows 8. Вместо этого для тестирования кода следует использовать развертывание на локальной машине.

Генерация живых плиток с использованием кода VB.NET в переносимой библиотеке классов

Существует много разных способов генерирования XML, требуемого для живых уведомлений плитки. Одним из способов является создание переносимой библиотеки классов VB.NET и использование литералов XML. На этот проект можно ссылаться как из серверной части, так и из приложения Metro. Вот код генератора XML, используемый в этих примерах:

Public Shared Function Generate(title As String, time As DateTime) As XElement
 
    Dim element = <tile><visual><binding template="TileWideText09"><text id="1"><%= title %></text><text id="2"><%= time.ToString() %></text></binding><binding template="TileSquareText04"><text id="1"><%= title %></text></binding></visual></tile>
 
    Return element
 
End Function