WP8 — Агент запланированных задач для push-уведомлений

Я пытаюсь связать свое приложение с push-уведомлениями, и разработчик серверной части выбирает Pusher в качестве поставщика уведомлений.

.NET SDK очень грязный, неаккуратный и синхронный, что не работает на WP8, поэтому я переписал его, и теперь он работает нормально.

Вопрос в следующем: требуется ли запланированная задача для получения push-уведомлений и обновления плитки/тоста? Или есть какой-то лучший метод?

К сожалению, я не могу изменить поставщика push-уведомлений.


person Davide Rossetto    schedule 09.09.2014    source источник


Ответы (1)


Вы можете просто отправлять push-уведомления Tile и Toast на телефон, и они будут работать, даже если ваше приложение не запущено. Для этого вам не нужна фоновая задача.

Вот пример кода, который я использую в настольном приложении для отправки push-уведомлений на Windows Phone 8.0:

const String toastTemplate =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\">" +
"<wp:Toast>" +
"<wp:Text1>{0}</wp:Text1>" +
"<wp:Text2>{1}</wp:Text2>" +
"<wp:Param>{2}</wp:Param>" +
"</wp:Toast>" +
"</wp:Notification>";


String message = String.Format(toastTemplate, "Test", "updated: " + DateTime.Now.ToString(), "/Pages/SyncPage.xaml");
Status = await PushNotifiactionsManager.SendNotification(cfg.PushNotificationUri, message, 2);



public static async Task<string> SendNotification(string pushNotificationUri, string message, short notificationClass)
{
  String responseText;
  if (message.Length > 3072)
  {
    responseText = String.Format("The message must be <= 3072 bytes: {0}", message);
  }
  else
  {
    HttpClient request = new HttpClient();
    // Add message headers.
    request.DefaultRequestHeaders.Add("X-MessageID", Guid.NewGuid().ToString());
    request.DefaultRequestHeaders.Add("X-NotificationClass", notificationClass.ToString());
    if (notificationClass == 1)
    {
      request.DefaultRequestHeaders.Add("X-WindowsPhone-Target", "token");
    }
    else if (notificationClass == 2)
    {
      request.DefaultRequestHeaders.Add("X-WindowsPhone-Target", "toast");
    }
    try
    {
      // Send the message, and wait for the response.
      HttpResponseMessage response = await request.PostAsync(pushNotificationUri, new StringContent(message));
      IEnumerable<string> values;
      String connectionStatus = String.Empty;
      if (response.Headers.TryGetValues("X-DeviceConnectionStatus", out values))
      {
        connectionStatus = values.First();
      }
      String subscriptionStatus = String.Empty;
      if (response.Headers.TryGetValues("X-SubscriptionStatus", out values))
      {
        subscriptionStatus = values.First();
      }
      String notificationStatus = String.Empty;
      if (response.Headers.TryGetValues("X-NotificationStatus", out values))
      {
        notificationStatus = values.First();
      }
      responseText = String.Format("{0}: {1}, {2}, {3}, {4}",
        notificationClass == 1 ? "Tile" :
        notificationClass == 2 ? "Toast" : "Raw",
        response.StatusCode,
        connectionStatus, subscriptionStatus, notificationStatus);
    }
    catch (WebException ex)
    {
      responseText = ex.Message;
    }
  }

  return "Notification response: " + responseText;
}
person Jogy    schedule 09.09.2014
comment
Я пытаюсь, но это не работает, плитка и тост не меняются, когда я отправляю push-уведомления, а приложение находится в фоновом режиме/закрыто. - person Davide Rossetto; 09.09.2014
comment
@DavideRossetto Я добавил пример кода, который использую для отправки всплывающих уведомлений в приложение для телефона. Проверьте, отправляете ли вы уведомление аналогичным образом - person Jogy; 09.09.2014