所需的行为是拦截应用程序中的原始通知(无需后台任务或用户放弃其宝贵的后台任务点之一)。根据{{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
,并在事件查看器中返回“设备连接状态:已连接”以及新的日志条目集。
答案 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);
}
});
}