更新
该方案现在已在以下位置进行了充分解释: http: //www.windowsazure.com/en-us/manage/services/notification-hubs/notify-users-aspnet/
下面的解决方案不再起作用,因为通知中心不在预览版中,并且 .NET SDK 中有一些重大更改。
旧答案
您概述的解决方案是正确的。需要注意的是,从应用程序后端进行注册管理时,您必须将当前注册的令牌存储在某处(通常在设备应用程序中,但在后端的安装表中也可以)。
假设您将“旧”令牌存储在设备上,您必须实现以下逻辑。
在后端
一个接受两个参数的端点:“oldToken”、“newToken”。基本上,这要么创建一个新注册(根据需要更改模板/本机或标签),要么更新当前注册。
var hubClient = NotificationHubClient.CreateClientFromConnectionString(connectionString, "<notification hub name>");
if (hubClient.RegistrationExists("oldDeviceToken"))
{
hubClient.UpdateRegistrationsWithNewPnsHandle("oldDeviceToken", "newDeviceToken");
} else
{
hubClient.CreateAppleNativeRegistration("newDeviceToken", new string[] {"myTag"});
}
在您修改当前注册、添加标签、修改模板的情况下,可能会有更多场景……在 hubClient 上,您拥有所有这些方法,它们是不言自明的。本文末尾提供了一些高级信息。
在设备应用程序中
实现以下逻辑:
- 如果没有存储旧令牌,则使用新令牌(backendEndpoint(newToken,newToken))联系后端,当它返回时将令牌存储在本地
- 如果有旧令牌,并且它与新令牌不同,请使用新旧令牌(backendEndpoint(oldToken,newToken))联系后端,当调用完成时将新令牌存储在本地。
- 如果有旧token和新token没有区别,但最后一次注册发生在30多天前,用旧token调用后端(backendEndpoint(oldToken, oldToken))。
我们将尽快为此场景添加一个示例。