Статьи

Отправка push-уведомлений на Windows Phone 7

Для приложений Windows Phone 7 его можно привязать к веб-службе, которая будет отправлять push-уведомления. Существует два типа уведомлений, которые можно отправлять на устройство — тост и тайл. В верхней части строки заголовка появляются всплывающие уведомления, независимо от того, какое приложение запущено в данный момент, чтобы уведомить пользователя об изменениях, связанных с приложением или данными, которые обрабатываются этим конкретным приложением. Вот как вы можете отправлять уведомления о тостах.

С другой стороны, уведомления плитки появляются только в том случае, если приложение было закреплено на начальном экране. Уведомление плитки может отображать число в верхнем правом углу плитки приложения, также известное как значок. Можно изменить фоновое изображение для плитки и заголовок. Все это обрабатывается через HTTP-запросы.

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

Итак, давайте посмотрим на код настройки канала для уведомления:

HttpNotificationChannel channel = HttpNotificationChannel.Find("NotificationTest_WP7");

if (channel == null)
{
channel = new HttpNotificationChannel("NotificationTest_WP7");
channel.Open();
}

if (!channel.IsShellTileBound)
channel.BindToShellTile();

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

ПРИМЕЧАНИЕ. Иногда вы можете получить сообщение о том, что канал не открыт. В этом случае просто перезапустите сеанс отладки. Кажется, время от времени возникает проблема со службой Live, которая не позволяет подключиться.

Служба, которая будет обрабатывать запросы (вы можете увидеть, как я реализовал пример сервера в статье, на которую я ссылался выше), имеет следующую структуру:

string channelURI = "YOUR_CHANNEL_URI_HERE”;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(channelURI);
request.Method = "POST";
request.ContentType = "text/xml";
request.Headers.Add("X-NotificationClass", "1");
request.Headers.Add("X-WindowsPhone-Target", "token");

string notificationData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\">" +
"<wp:Tile>" +
"<wp:BackgroundImage></wp:BackgroundImage>" +
"<wp:Count>99</wp:Count>" +
"<wp:Title>TEST</wp:Title>" +
"</wp:Tile> " +
"</wp:Notification>";

byte[] contents = Encoding.Default.GetBytes(notificationData);

request.ContentLength = contents.Length;

using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(contents, 0, contents.Length);
}

string notificationStatus;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
notificationStatus = response.Headers["X-NotificationStatus"];
}

Заголовки HTTP, отправляемые в службу, немного отличаются. Например, я использую токен вместо toast в качестве X-WindowsPhone-Target . Это будет указывать, что будет использоваться уведомление плитки.

Если вы посмотрите на структуру отправляемого содержимого XML, вы увидите тег BackgroundImage , который определяет фон плитки. В соответствии с текущими спецификациями , если изображение хранится в удаленном месте, его размер не должен превышать 80 КБ, а загрузка не должна занимать более 1 минуты.

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

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

Максимальное число, которое можно передать, равно 99. Если вы передадите большее значение, в любом случае будет отображаться значение 99.

А тег Title определяет, каким будет заголовок для плитки при получении уведомления.

На ранних этапах отладки я настоятельно рекомендую взглянуть на HTTP-ответ, поскольку он содержит некоторую важную информацию о состоянии соединения с каналом, а также некоторую информацию, касающуюся отправленного сообщения.

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

Я не передал изображение для запроса, поэтому используется изображение по умолчанию. Если вы хотите изменить изображение плитки по умолчанию, вы можете перейти в Свойства (в обозревателе решений) и изменить параметры плитки: