2013-03-09 66 views
0

所需的行爲是攔截應用程序中的原始通知(不需要後臺任務或用戶放棄其寶貴的後臺任務點之一)。根據http://msdn.microsoft.com/en-us/library/windows/apps/xaml/JJ709907(v=win.10).aspx的示例代碼,我創建了一個事件處理程序來攔截原始通知。在我創建的一個應用程序中,使用Azure移動服務通過WNS發送通知事件處理程序被觸發並且效果很好。如何獲取PushNotificationChannel.PushNotificationReceived事件處理程序來攔截通知?

但在第二個應用程序,它不工作。通知似乎很好。也就是說,當我的Web服務讓WNS發送一個Toast通知時,它就會顯示出來。此外,我可以調試/跟蹤原始通知,並且它們似乎也被創建得很好。有我缺少的設置嗎?

我通過Fiddler看到請求和結果,但也許只是因爲我在本地運行MVC 4.0 Web API項目?要求是這樣的:

{Channel URI:    https://bn1.notify.windows.com/?token=AgYAAACuGgtx... 
TTL:      - 
Cache:     no 
Request for status:  no 
Tag:      
Priority:     Normal 
Token retry count:  0 

really 
} 

然後我可以跟蹤這個(通過WNSRecipe/NotificationsExtensions代碼是這樣的WAT樣品的部分全部完成)。我得到:

{Sent WNS notification: Received 
Channel URI:    https://bn1.notify.windows.com/?token=AgYAAACuGgtx... 
Notification status:  Received 
Status code:    OK 
Device connection status: NotApplicable 
Error description:   
Debug Trace:    BN1WNS2011828 
MessageId:    3FA318CE5C48E9CF 
Timestamp:    3/8/2013 9:23:18 PM -07:00 


- REQUEST ------------------------------------------------------------------ 
X-WNS-Type     : wns/raw 
Content-Type     : application/octet-stream 
Authorization     : Bearer EgAaAQMAAAAEgAAACoAAx1d3DqT9jZxJdOFIUJ9... 
Host       : bn1.notify.windows.com 
Content-Length    : 6 

really 

- RESPONSE ----------------------------------------------------------------- 
X-WNS-NOTIFICATIONSTATUS  : received 
X-WNS-MSG-ID     : 3FA318CE5C48E9CF 
X-WNS-DEBUG-TRACE    : BN1WNS2011828 
Content-Length    : 0 
Date       : Sat, 09 Mar 2013 04:23:11 GMT 
} 

而結果:

{Channel URI:    https://bn1.notify.windows.com/?token=AgYAAACuGgtx... 
Notification status:  Received 
Status code:    OK 
Device connection status: NotApplicable 
Error description:   
Debug Trace:    BN1WNS2011828 
MessageId:    3FA318CE5C48E9CF 
Timestamp:    3/8/2013 9:23:18 PM -07:00 
} 

所以我想通知被髮送。

更新:我已返回並重新檢查設置,並在應用中添加了測試按鈕以發佈我的請求。 (所以我知道該應用程序是積極的,毫無疑問)。我在我的通知請求中添加了RequestForStatus = true,並在「事件查看器」中獲取「設備連接狀態:連接」以及新的日誌條目集。

+0

當你說調試/跟蹤原始通知似乎是**創建**罰款,是你看到他們被交付給客戶(通過說Fiddler),而沒有采取行動? – 2013-03-09 00:38:51

+0

@ Jim O'Niel我爲此添加了更多細節。我不確定它們是否被傳送到Windows8/Win8應用程序。我只是看到他們,因爲我在本地運行MVC應用程序。有沒有辦法讓Fiddler直接攔截通知?謝謝,順便說一下,你的博客文章有幫助。第二次想到 – Stonetip 2013-03-09 03:48:02

+0

,跳過提琴手。在事件查看器>應用程序和服務日誌> Microsoft> Windows>推送通知 - 平臺是哪裏(我相信)你應該看到什麼到你的機器。我並不完全熟悉那裏顯示的內容,但可能值得一看,看看您是否看到錯誤或表示收到了該消息(包括工作和非工作情況下) – 2013-03-09 04:26:45

回答

0

在我遇到各種可能的問題/解決方案後,我終於找到了錯誤。罪魁禍首是在我的事件處理程序代碼中。無論出於何種原因,使用NewtonSoft JObject的代碼在我的另一個測試項目中運行良好,但在此項目中以一種令人討厭和沉默的方式失敗。我轉而使用ServiceStack.Text(無論如何我都有這個意思,因爲它的速度要快得多......除了簡明的原始通知之外,我還會嚮應用程序傳遞更多的數據和從應用程序中獲取更多數據)。

我又回到了最簡單的代碼首先,這樣做無非是:

private async void OnPushNotification(PushNotificationChannel sender, PushNotificationReceivedEventArgs e) 
{ 
    if (e.NotificationType == PushNotificationType.Raw) 
    { 
     e.Cancel = true; 

     String notificationContent = String.Empty; 

     notificationContent = e.RawNotification.Content; 
    } 
} 

這取代了問題的方法,該方法(僅供參考)是這樣的:

private async void OnPushNotification(PushNotificationChannel sender, PushNotificationReceivedEventArgs e) 
{ 
    String notificationContent = String.Empty; 

    switch (e.NotificationType) 
    { 
     case PushNotificationType.Badge: 
     case PushNotificationType.Tile: 
     case PushNotificationType.Toast: 
      notificationContent = e.TileNotification.Content.GetXml(); 
      break; 


     case PushNotificationType.Raw: 
      notificationContent = e.RawNotification.Content; 
      break; 
    } 

    e.Cancel = true; 


    try 
    { 
     JObject jObject = JObject.Parse(notificationContent); 

     JToken jToken; 

     jObject.TryGetValue("refresh", out jToken); 

     bool refreshValue = jToken != null && Convert.ToBoolean(jToken.ToString()); 

     if (refreshValue) 
     { 
      await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, RefreshTodoItems); 
     } 
    } 
    catch (Exception err) 
    { 
     Debug.WriteLine(err.Message); 
    } 
} 

最後,我結束了這工作得很好:

private async void OnPushNotification(PushNotificationChannel sender, PushNotificationReceivedEventArgs e) 
{ 
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
     { 
      if (e.NotificationType != PushNotificationType.Raw) return; 
      e.Cancel = true; 

      try 
      { 
       // Use ServiceStack.Text.WinRT to get this 
       var jsonObj = JsonSerializer.DeserializeFromString<JsonObject>(e.RawNotification.Content); 

       // TODO: Do something with this value now that it works 
      } 
      catch (Exception err) 
      { 
       Debug.WriteLine(err.Message); 
      } 
     }); 
}