5

更新:情节变厚了。我更改了我的频道名称,它突然开始工作(这意味着我的推送服务没有问题,因为我从 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 推送结构:

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

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

DeviceConnectionStatus => 已连接

NotificationStatus => 收到

订阅状态 => 活动

然后……什么都没有。我的应用程序上没有显示推送状态。我现在已经在我的设备、模拟器、另一台设备和多台服务器上尝试过,结果总是一样的。一切看起来都在工作,只是它不起作用。

4

2 回答 2

3

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

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

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

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

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

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

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


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

尤其是如果您的 Web 服务不是使用 WCF、.NET、Azure 等构建的,那么在 WP7 上使用推送通知就像是瞎了眼。

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

于 2011-08-04T22:03:39.957 回答
0

您是否从每个设备获取 URL?每次您的设备连接时,您都需要从每个设备的推送通知服务中获取一个 URL,

什么时候需要找到从每个客户端检索 url 的方法,

一旦您这样做并且您仍然没有收到推送通知,那么我会写信给微软,看看他们是否可以看到与推送通知有关的任何内容

于 2011-07-23T04:36:47.797 回答