更新:情节变厚。我更改了频道名称,它突然工作了(这意味着我的推送服务没有问题,因为我从Microsoft推送通知服务器获得了相同的 HTTP 响应)。
然而,对我来说,这不是一个解决方案。如果我在它不起作用时得到与我在它不起作用时相同的响应,我将如何能够测试这一点并知道我的用户正在收到他们的推送通知?
[原文]
我一直在尝试将推送通知发送到我的 Windows Phone 7 设备,但我遇到了非常大的问题,我找不到任何答案。我将从 c# 代码开始。
我使用以下 C# 代码设置推送通知。
private HttpNotificationChannel channel;
private static string PUSH_CHANNEL = "MySpecialPushChannel";
private Uri PushUri = null;
private bool IsPushRegistered = false;
public void StartPushSubscription()
{
try
{
channel = HttpNotificationChannel.Find(PUSH_CHANNEL);
}
catch
{}
if (channel != null)
{
PushUri = channel.ChannelUri;
if (!channel.IsShellTileBound)
channel.BindToShellTile();
}
else
{
channel = new HttpNotificationChannel(PUSH_CHANNEL);
channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(channel_ChannelUriUpdated);
channel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(channel_HttpNotificationReceived);
channel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(channel_ErrorOccurred);
try
{
channel.Open();
channel.BindToShellTile();
}
catch (Exception err)
{
channel = null;
IsPushRegistered = false;
// Code to try again
}
}
}
void channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
{
PushUri = e.ChannelUri;
IsPushRegistered = true;
}
我遵循标准的WP7推送结构:
- 找到 HttpNotificationChannel (或启动一个新的频道)
- 注册事件处理程序以取回推送通知 uri
- 打开频道
- 绑定到磁贴
- 处理通道 Uri(我们将其发送到我们的服务以等待我们发送推送通知时的快乐一天)
好吧......到目前为止一切顺利。 没有错误,我得到了我的 Uri,将其发送到我的服务就可以了。我将我的应用固定到开始屏幕,我的服务向 Uri 发送推送请求(仅发送计数,以便我在右上角获得一个小推送计数数字)。我返回具有以下内容的HTTP 200状态:
设备连接状态 => 已连接
通知状态 => 已接收
订阅状态 => 活动
然后。。。无。我的应用程序上未显示推送状态。我现在已经在我的设备、模拟器、另一台设备上以及多台服务器上尝试过,结果总是相同的。一切看起来都在工作,除了它不起作用的事实。
然而,对我来说,这不是一个解决方案。如果我在它不起作用时得到与我在它不起作用时相同的响应,我将如何能够测试这一点并知道我的用户正在收到他们的推送通知?
答案是,你不能。这是WP7处理通知方式的限制。
对于磁贴和 Toast 等结构化通知,如果收到"已连接/活动/已接收/200"响应,则可以知道 MPNS 已接受通知请求。但是,这并不意味着您已发送有效的 XML 有效负载。
处理分析 XML 的组件是推送客户端,该进程在手机上运行,它接受推送通知并将其发送给适当的应用程序、显示 Toast 等。
如果您发送了无效的 XML,则绝对没有迹象表明您已这样做。最多,如果尝试将通知再次发送到同一推送通道 URI,则会收到 404 作为响应。显然,获取特定应用程序的无效 XML 有效负载会使该应用程序的推送通道关闭,要求您再次完成整个过程。
我在与我们的服务器团队一起调试时发现了这一点,并通过尝试让手机显示备用动态磁贴。我能为您提供的唯一建议是对您的 XML 进行四重检查。
对于具有无效 XML 的 Toast 通知,你将在推送通知通道的错误事件处理程序中收到错误,因为你能够在应用程序处于活动状态时发送/接收 Toast 通知。
如果Microsoft中的任何人正在阅读本文,请提供有关推送通知系统中可能的错误状态的更全面的文档。我们还需要一个用于磁贴通知的事件处理程序,或者至少允许我们在应用处于前台时接收磁贴通知并触发通知通道错误事件,以便我们可以知道我们的 XML 有效负载无效。
特别是如果你的Web服务不是用WCF,.NET,Azure等构建的,那么在WP7上使用推送通知就像盲目徘徊一样。
异常消息"InvalidOperationException(Failed to open channel)
"的文档不应显示为:"当通知通道无法打开时,将引发此异常。尝试再次打开通知通道。(参考资料)
您是否从每个设备获取 URL? 每次设备连接时,您都需要从每个设备的推送通知服务中获取一个 URL,
当它这样做时,您需要找到一种从每个客户端检索 URL 的方法,
一旦你这样做了,你仍然没有收到推送通知,那么我会写信给微软,看看他们是否可以看到与推送通知有关的任何内容