我想检查我的推送通知实现是否正确。
每次我打开我的应用程序(实际上我只在特定页面上注册推送通道,所以每次我从该页面来回切换时(,都会创建一个新的推送通道 URI,我将其存储在我的移动服务数据库中以向其发送推送通知。这对我来说似乎不正确,因为每次打开应用程序/页面时都会生成一个新的推送通道 URI,因此通道 URI 列表会针对使用我的应用程序的每台设备而增长。我假设您创建一个推送通道,存储通道 URI 并根据需要推送到它。我将在这里指出我正在使用原始推送通知。
我知道推送通道会经常过期,但对我来说,每次我退出应用程序/页面时都会发生这种情况,因此当调用 onNavigateTo 时,我发现推送通道确实存在并且总是创建一个新的通道 URI。这是对的吗?
我的代码如下:
protected override void OnNavigatedTo(NavigationEventArgs e( { 注册推送通道((; }
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 服务中。然后,Web 服务将通知发送到通道 URI。当我退出应用程序或页面并返回到它时,会找到推送通道,但会创建一个新的通道 URI,我再次将其保存到我的 Web 服务中。实际上,我的频道表一直在增长和增长。
那么,这是它应该与不断生成的新通道 URI 一起工作的方式吗?这对我来说有点没有意义。我不确定 toast 和磁贴通知如何工作,但我假设通道 URI 在应用程序关闭时需要是静态的,以便在应用程序关闭时继续接收通知,但也许这可能是绑定toast和绑定到tile的功能,所以我正在做的是正确的,因为它与原始通知有关。
你基本上做对了。
推送通知是一件有趣的事情。
创建一个通道,将其发送到服务器,然后服务器可以发送,直到失败(通道 Uri 过期或出现错误(。此时,应用需要创建新的 ChannelUri,然后更新服务器上为该应用/设备存储的值。然后,服务器将能够发送通知。
一些要点
- 当为仍然有效的通道请求新的通道 Uri 时,你将返回相同的通道 Uri。
- 当你请求新的频道 uri 并且当前频道 uri 已过期时,通常会返回相同的 URI,但频道将再次上线。
- 如果不运行
registerPushChannel
方法等代码,就无法从应用内知道频道是否已过期。(除非你在后端跟踪此情况,并且应用会查询后端。
无法告知应用频道 - 已过期,也无法告知用户重新打开应用以使用推送基础结构重新建立频道连接。
尝试并确保通道始终可用的标准方法是在启动应用时检查通道。
这就是您正在做的事情,您可能只想确保更新服务器记录,而不仅仅是添加更多记录。