Статьи

EvenTiles от начала до конца: push-уведомления

В предыдущей части EvenTiles вы видели, что приложения, работающие на устройствах размером 256 МБ, не могут использовать периодические агенты. Конечно, приложение все еще работает, но содержимое обратной стороны вторичной плитки, когда она прикреплена к стартовому экрану, не изменяется. Поскольку устройства Windows Phone емкостью 256 МБ полностью поддерживают push-уведомления , можно изменить содержимое вторичного тайла с небольшими дополнительными усилиями. В этом выпуске EvenTiles мы рассмотрим добавление уведомлений плитки в приложение. Эти мозаичные уведомления доставляются на отдельные устройства Windows Phone через службу push-уведомлений Microsoft, как и все остальные push-уведомления.

В этой записи блога мы сконцентрируемся на стороне клиента, в основном предоставляя код, который регистрирует приложение. Чтобы протестировать приложение, мы будем использовать небольшое приложение ASP.NET, основанное на образце, который представлен в статье Как отправлять и получать уведомления о плитках для Windows Phone . В эту запись блога не входит показ хостинга веб-службы (например, с использованием функциональности Azure).

ПРИМЕЧАНИЕ. Тестовое приложение ASP.NET не может быть создано с использованием Visual Studio 2010 Express для Windows Phone. Для создания тестового приложения вам потребуется по крайней мере Visual Studio 2010 Professional или бесплатная Visual Web Developer 2010 Express .

Push-уведомления на вторичных тайлах

Что-то, что не совсем понятно в упомянутой статье Как или в документации, касающейся Push-уведомлений на MSDN, заключается в том, что отправка обновлений плитки с помощью Push-уведомлений не ограничивается плиткой приложения, но вы также можете использовать тот же подход для обновления Вторичные плитки. Поскольку мы имеем дело со вторичной плиткой в ​​приложении EvenTiles, мы сосредоточимся на обновлении вторичной плитки. В тестовом приложении ASP.NET мы создадим следующее сообщение для обновления нашей плитки:

Обновление вторичной плитки:

    // Create the Tile message.
    string tileMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
    "<wp:Notification xmlns:wp=\"WPNotification\">" +
        "<wp:Tile ID=\"/MainPage.xaml?TileId=Secondary\">" +
          "<wp:BackContent>" + TextBoxBackContent.Text + "</wp:BackContent>" +
          "<wp:Count>" + nrRuns.ToString() + "</wp:Count>" +
       "</wp:Tile> " +
    "</wp:Notification>";

 Путем явного указания идентификатора плитки вы можете сообщить службе push-уведомлений о том, что хотите обновить конкретную (вторичную) плитку. Пропуск идентификатора передает обновление на плитку приложения. Так как EvenTiles создает Вторичный Плитку, как показано ниже, передача сообщения Уведомления Плитки, как показано выше, обновит Вторичный Плитку, если он будет закреплен на Начальном экране. В этом примере мы обновляем только BackContent для вторичного тайла и счетчик на его передней части, но можно обновить дополнительные свойства вторичного тайла. Конечно, важно использовать один и тот же URI для вторичного живого тайла при его обновлении через уведомление тайла.

Создание вторичной плитки:

    private void btnInstall_Click(object sender, RoutedEventArgs e)
    {
        StandardTileData NewTileData = new StandardTileData
        {
            BackgroundImage = new Uri("Background.png", UriKind.Relative),
            Title = "EvenTiles",
            Count = 0,
            BackBackgroundImage = new Uri("BackBackTile.png", UriKind.Relative),
            BackTitle = "EvenTiles",
            BackContent = App.ActualSecBackContent
        };
        ShellTile.Create(new Uri("/MainPage.xaml?TileId=Secondary", UriKind.Relative), NewTileData);
    }

Для получения уведомлений плитки в EvenTiles приложение должно создать канал HttpNotificationChannel или подключиться к уже созданному каналу, если приложение снова запустится на определенном устройстве Windows Phone. В следующем фрагменте кода показано, как настроить новый канал уведомлений. Если канал успешно открыт, он передаст URI через обработчик событий ChannelUriUpdated . Этот URI используется для отправки уведомлений на конкретное устройство Windows Phone, которое получило этот URI от службы push-уведомлений. Этот URI уникален для приложения и телефона, на котором запущено приложение. Если канал уже существует, этот метод просто начинает прослушивать изменения канала или ошибки через ChannelUriUpdated и ErrorOccurred события соответственно.

Получение канала уведомлений:

    public class TileNotifications
    {
        public const string tileNotificationChannel = "EvenTilesChannel";
     
        public void SetupChannel()
        {
            var pushChannel = HttpNotificationChannel.Find(tileNotificationChannel);
            if (pushChannel == null)
            {
                pushChannel = new HttpNotificationChannel(tileNotificationChannel);
                pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
                pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);
                pushChannel.Open();
                pushChannel.BindToShellTile();
            }
            else
            {
                pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
                pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);
     
                // Display the URI for testing purposes. Normally, the URI would be passed back to a web service.
                System.Diagnostics.Debug.WriteLine(pushChannel.ChannelUri.ToString());
            }
        }

Если вы хотите отправить push-уведомления из веб-службы, приложение Windows Phone обычно отправляет этот URI в веб-службу, которая, в свою очередь, использует ее для доставки push-уведомлений зарегистрированному устройству. В нашем тестовом приложении мы просто отображаем URI в окнах отладки Visual Studio, чтобы иметь возможность скопировать его в наше тестовое приложение ASP.NET.

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

Закрытие канала уведомлений:

    public void CloseChannel()
    {
        var pushChannel = HttpNotificationChannel.Find(tileNotificationChannel);
        if (pushChannel != null)
        {
            pushChannel.ChannelUriUpdated -= PushChannel_ChannelUriUpdated;
            pushChannel.ErrorOccurred -= PushChannel_ErrorOccurred;
            pushChannel.Close();
            pushChannel.Dispose();
            App.GetLiveTileNotifications = false;
        }
    }

Наконец, в нашем приложении EvenTiles мы реализуем некоторую упрощенную обработку событий, чтобы реагировать на изменения push-каналов и ошибки. Эта реализация предназначена только для демонстрации и может использоваться для ручной передачи URI канала в приложение ASP.NET или для закрытия / повторной инициализации push-канала при определенных ошибках. В следующем фрагменте кода показано, как просто записать URI канала в окно вывода Visual Studio.

Обработка событий Push-канала:

{
    switch (e.ErrorType)
    {
        case ChannelErrorType.ChannelOpenFailed:
            App.GetLiveTileNotifications = false;
            break;
        case ChannelErrorType.PayloadFormatError:
            SetupChannel();
            break;
        default:
            CloseChannel();
            break;
    }
}
 
void PushChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
{
    System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString());
    App.GetLiveTileNotifications = true;
}

образДля отправки уведомлений плитки в EvenTiles обязательно запустите EvenTiles и включите уведомления плитки через страницу настроек. После включения уведомлений плитки можно скопировать URI канала из окна вывода Visual Studio и вставить его в тестовое приложение ASP.NET. После этого вы можете отправлять обновления плитки в EvenTiles.

 

образТестовое приложение ASP.NET делает это в потоке ThreadPool . Вы можете указать количество обновлений и время между обновлениями. Каждый раз, когда отправляется другое обновление, свойство count, которое будет отображаться на лицевой стороне вторичной плитки, которую EvenTiles закрепила на начальном экране, будет обновляться.

Несмотря на то, что фоновые агенты не поддерживаются на устройствах с 256 МБ, у нас есть хороший обходной путь, используя Push-уведомления, потому что они полностью поддерживаются. Конечно, это означает, что вам нужно вкладывать больше средств в программирование на стороне сервера, но это также означает, что взаимодействие с конечным пользователем приложения Windows Phone может быть очень похожим как на устройстве 512 МБ, так и на устройстве 256 МБ. Чтобы это работало, целевое устройство должно иметь сетевое соединение.

Полный пример кода для EvenTiles пока можно скачать здесь . Если вы хотите протестировать приложение на устройстве объемом 256 МБ (эмуляторе), вам также необходимо загрузить и установить обновление Windows Phone 7.1.1 SDK . Тестовое приложение ASP.NET также доступно для отдельной загрузки . Чтобы запустить это тестовое приложение, вам нужна версия Visual Studio 2010, которая поддерживает создание и отладку приложений ASP.NET.

В следующем видео показано, как подписаться на уведомления о плитках из приложения EvenTiles и как проверить новые функции с помощью тестового приложения APS.NET.