Windows Phone 8推送通知推送通道始终创建新的通道uri

时间:2013-10-03 02:53:48

标签: c# windows-phone-8 push-notification mpns

我想检查我的推送通知实现是否正确。

每次我打开我的应用程序(实际上我只在特定页面上注册推送通道,所以每次我从该页面来回移动)都会创建一个新的推送通道URI,我存储在我的移动服务数据库中发送推送通知。这对我来说似乎不正确,因为每次打开app / page时都会生成一个新的推送通道URI,因此对于使用我的应用程序的每个设备,通道URI列表只会增长和增长。我假设你创建一个推送通道,存储通道URI并根据需要推送到它。我会在这里注意到我正在使用原始推送通知。

据我所知,推送频道每隔一段时间就会过期,但对我而言,每次我退出应用程序/页面时都会发生这种情况,因此当调用onNavigateTo时,我会找到确实存在的推送频道和新频道始终创建URI。它是否正确?

我的代码如下:

protected override void OnNavigatedTo(NavigationEventArgs e)         {            registerPushChannel();          }

private void registerPushChannel()
    {
        // The name of our push channel.
        string channelName = "RawSampleChannel";

        // Try to find the push channel.
        pushChannel = HttpNotificationChannel.Find(channelName);

        // If the channel was not found, then create a new connection to the push service.
        if (pushChannel == null)
        {
            pushChannel = new HttpNotificationChannel(channelName);

            // Register for all the events before attempting to open the channel.
            pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
            pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);
            pushChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(PushChannel_HttpNotificationReceived);

            pushChannel.Open();

        }
        else
        {
            // The channel was already open, so just register for all the events.
            pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
            pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);
            pushChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(PushChannel_HttpNotificationReceived);

            // code which passes the new channel URI back to my web service               

        }

    }

protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        pushChannel.Close();
    }

因此,为了澄清,应用程序已打开,推送频道已注册,频道uri已保存在我的网络服务中。然后,Web服务将通知发送到通道uri。当我退出应用程序或页面并返回它时,找到推送通道但创建了一个新的通道uri,我再次将其保存到我的Web服务。我的频道表实际上正在不断增长和发展。

这是否应该与不断生成的新频道URI一起使用?这对我来说没什么意义。我不确定烤面包和磁贴通知是如何工作的,但我认为当应用关闭以便在应用关闭时继续接收通知时,通道URI需要是静态的,但也许这可能是bindtotoast的功能和bindtotile一起,我正在做的是正确的,因为它与原始通知有关。

1 个答案:

答案 0 :(得分:7)

你大部分都是这样做的。

推送通知是一件有趣的事情 您创建一个频道,将其发送到您的服务器,然后服务器可以发送直到它失败(频道Uri过期或出现错误)。 此时,应用需要创建一个新的ChannelUri,然后更新在服务器上为该应用/设备存储的值。然后,服务器将能够发送通知。

一些重点

  1. 当一个新的频道Uri被请求一个仍然有效的频道时,你会得到同一个频道。
  2. 当您要求新频道uri和当前频道已经过期时,您通常会返回相同的uri,但该频道将重新播出。
  3. 如果没有像registerPushChannel方法那样运行代码,则无法知道某个频道是否已在应用中过期。 (除非您在后端跟踪此信息,并且应用程序会查询后端。)
  4. 无法告诉应用程序频道已过期,或者告诉用户重新打开应用以使用推送基础架构重新建立频道连接。
  5. 尝试确保频道始终可用的标准方法是在应用启动时检查频道 这就是你正在做的事情,你可能只想确保更新服务器记录而不仅仅是添加更多。