如何获取PushNotificationChannel.PushNotificationReceived事件处理程序来拦截通知?

时间:2013-03-09 00:07:36

标签: c# windows-8 notifications

所需的行为是拦截应用程序中的原始通知(无需后台任务或用户放弃其宝贵的后台任务点之一)。根据{{​​3}}的示例代码,我创建了一个拦截原始通知的事件处理程序。在我创建的一个应用程序中,使用Azure移动服务通过WNS发送通知,事件处理程序被触发并且运行良好。

但是在第二个应用程序中,它不起作用。通知似乎没问题。也就是说,当我的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,并在事件查看器中返回“设备连接状态:已连接”以及新的日志条目集。

1 个答案:

答案 0 :(得分:1)

在我解决各种可能的问题/解决方案后,我终于发现了什么问题。罪魁祸首在我的事件处理程序代码中。无论出于何种原因,使用NewtonSoft JObject的代码在我的其他测试项目中运行良好,但是在这个项目中却以一种讨厌和沉默的方式失败了。我切换到使用ServiceStack.Text(无论如何我都是这个意思,因为据说速度要快得多......在未来的道路上,除了简单的原始通知之外,我还会向应用程序传输更多数据)。 / p>

我先回到最简单的代码,除了:

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

        String notificationContent = String.Empty;

        notificationContent = e.RawNotification.Content;
    }
}

这取代了(FYI)看起来像这样的问题方法:

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);
            }
        });
}