Параметр NotificationClass при отправке уведомлений Windows Phone 7

После того, как я рассказал (здесь и здесь) о механизме уведомлений для Windows Phone 7 некоторые из вас немного огорчились, что я не описал смысл заголовка X-NotificationClass, отправляемого вместе с самим уведомлением. Исправляюсь.

Итак, как мы помним, для отправки какого-либо уведомления мы используем адрес, полученный от сервиса в облаке и переданный третьему приложению для отправки уведомлений. Например, для отправки Toast-уведомления мы использовали с вами следующий программный код:

class Program
{
    private const string Url = @"http://sn1.notify.live.net/throttledthirdparty/01.00/AAFTkavjFpAuT4i1fIKvueDiAgoOs1ADAgAAAAQOMDAwAAAAAAAAAAAAAAA";

    static void Main(string[] args)
    {
        Console.Write("Header: ");
        string header = Console.ReadLine();
        Console.Write("Text: ");
        string text = Console.ReadLine();
        SendToast(Url, header, text);
        Console.ReadLine();
    }

    static void SendToast(string uri, string header, string text)
    {
        var client = new WebClient();

        client.Headers.Add("Content-Type", "text/html");
        client.Headers.Add("X-NotificationClass", "2");

        var message = "X-WindowsPhone-Target: toast" + Environment.NewLine + Environment.NewLine +
            @"<?xml version=""1.0"" encoding=""utf-8""?>
                <wp:PushNotification xmlns:wp=""WindowsPhonePushNotification"">
                    <wp:Toast>
                        <wp:Text1>{0}</wp:Text1>
                        <wp:Text2>{1}</wp:Text2>
                    </wp:Toast>
                </wp:PushNotification>";

        var result = client.UploadString(uri, "POST", String.Format(message, header, text));
        Console.WriteLine(result);
        Console.WriteLine("Device status is {0}", client.ResponseHeaders["X-DeviceConnectionStatus"]);
        Console.WriteLine("Notification status is {0}", client.ResponseHeaders["X-NotificationStatus"]);
    }
}

Как видно, перед отправкой сообщения мы определяем специальный HTTP-заголовок X-NotificationClass, который в каждом случае имеет разные значения. Какие значения может принимать этот заголовок и для чего он нужен? Давайте разберемся.

На самом деле этот заголовок выполняет две важные функции – определение типа уведомления и задание приоритета самого сообщения. Как я уже говорил, существует три типа уведомлений:

  • Tile Notifications – уведомления могут изменять изображение на “рабочем столе”;
  • Toast Notifications – уведомления всплывают в виде текстовых подсказок, по нажатию на которые можно перейти к самому приложению (даже если оно свернуто);
  • Raw Notifications – разработчик может сам определить логику обработки уведомления.

Выбор типа уведомления (Tile, Toast или Raw) зависит от того, какой диапазон значений используется. Уже внутри этого диапазона выбираются приоритеты.

Для Tile Notifications вы можете использовать одно из следующих значений в зависимости от приоритета:

  • 21: обычный приоритет;
  • 11: приоритетные уведомления (уведомления будут доставляться с фиксированным интервалом времени);
  • 1: приоритет "Real Time" (уведомление будет доставлено настолько быстро, насколько это возможно).

Для Toast Notifications вы можете использовать одно из следующих значений в зависимости от приоритета:

  • 22: обычный приоритет;
  • *12: приоритетные уведомления (уведомления будут доставляться с фиксированным интервалом времени);
  • 2: приоритет "Real Time" (уведомление будет доставлено настолько быстро, насколько это возможно).

Для Raw Notifications вы можете использовать одно из следующих значений в зависимости от приоритета:

  • 23-31: обычный приоритет;
  • 13-20: приоритетные уведомления (уведомления будут доставляться с фиксированным интервалом времени);
  • 3-10: приоритет "Real Time" (уведомление будет доставлено настолько быстро, насколько это возможно).

Таким образом, при отправке уведомлений мы можем изменять их тип и приоритет.