1

期望的行为是拦截应用程序中的原始通知(不需要后台任务或用户放弃他们宝贵的后台任务点之一)。根据http://msdn.microsoft.com/en-us/library/windows/apps/xaml/JJ709907(v=win.10).aspx上的示例代码,我创建了一个事件处理程序来拦截原始通知。在我创建的一个应用程序中,使用 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到我的通知请求中,并在事件查看器中返回“设备连接状态:已连接”以及新的日志条目集。

4

1 回答 1

1

在考虑了各种可能的问题/解决方案之后,我终于发现了问题所在。罪魁祸首是我的事件处理程序代码。无论出于何种原因,使用 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);
            }
        });
}
于 2013-03-12T11:40:20.887 回答