Windows Phone 7推送通知未显示在我的手机上

Mat*_*asS 5 silverlight silverlight-3.0 push-notification windows-phone-7 mpns

更新:情节变浓.我更改了我的频道名称,它突然正常工作(这意味着我的推送服务不是问题,因为我从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;
}
Run Code Online (Sandbox Code Playgroud)

我遵循标准的WP7推送结构:

  1. 找到HttpNotificationChannel(或开始一个新的)
  2. 注册事件处理程序以获取推送通知uri
  3. 打开频道
  4. 绑定到瓷砖
  5. 处理通道Uri(我们发送到我们的服务等待发送推送通知的快乐日

好的......到目前为止一切顺利.没有错误,我得到我的Uri,把它发送到我的服务就好了.我将我的应用程序固定到开始屏幕,我的服务向Uri发送推送请求(仅发送计数,以便我在右上角得到一个小推送计数).我通过以下方式获得HTTP 200状态:

DeviceConnectionStatus =>已连接

NotificationStatus =>已收到

SubscriptionStatus =>有效

然后......没什么.我的应用程序上没有显示推送状态.我现在已经在我的设备上,在模拟器中,在另一台设备上以及使用多个服务器上尝试了它,结果总是相同的.一切看起来都在起作用,除了它不起作用的事实.

mic*_*ett 3

然而,对我来说,这不是一个解决方案。如果我在它不工作时得到与正常工作时相同的响应,我将如何测试这一点并知道我的用户正在收到他们的推送通知?

答案是,你不能。这是 WP7 处理通知方式的限制。

对于 Tile 和 Toast 等结构化通知,如果您收到 Connected/Active/Received/200 响应,则可以知道 MPNS 接受了您的通知请求。但是,这并不意味着您已经发送了有效的 XML 负载。

处理解析 XML 的组件是推送客户端,它是在手机上运行的进程,用于接受推送通知并将其发送给适当的应用程序、显示 toast 等。

如果您发送了无效的 XML,则完全没有迹象表明您已经这样做了。最多,如果您尝试再次将通知发送到同一推送通道 URI,您将收到 404 响应。显然,获取特定应用程序的无效 XML 有效负载会导致该应用程序的推送通道关闭,从而要求您再次执行整个过程。

我在与我们的服务器团队进行调试时发现了这一点,并尝试让手机显示备用活动磁贴。我能为您提供的唯一建议是对您的 XML 进行四重检查。

对于具有无效 XML 的 Toast 通知,您将在推送通知通道的错误事件处理程序中收到错误,因为您可以在应用程序处于活动状态时发送/接收 Toast 通知。


如果 Microsoft 的任何人正在阅读本文,提供有关推送通知系统中可能的错误状态的更全面的文档。我们还需要一个用于 Tile 通知的事件处理程序,或者至少允许我们在应用程序位于前台时接收 Tile 通知并触发通知通道错误事件,以便我们可以知道我们的 XML 有效负载无效。

特别是如果您的 Web 服务不是使用 WCF、.NET、Azure 等构建的,那么在 WP7 上使用推送通知就像盲目徘徊。

异常消息的文档不应显示为“ InvalidOperationException(Failed to open channel):“当通知通道打开失败时引发此异常。请尝试再次打开通知通道。” (参考