注册管理
本主题介绍如何将设备注册到通知中心,以便接收推送通知。 本主题介绍高级别的注册,然后介绍了注册设备的两种主要模式:直接从设备注册到通知中心,并通过应用程序后端注册。
什么是设备注册?
注册是通知中心的子实体,它将设备 PNS 句柄(平台通知服务句柄,例如,ChannelURI、设备令牌、GCM registrationId)与标记以及可能模板相关联。 标记用于将通知路由到一组正确的设备句柄。 有关详细信息,请参阅路由和标记表达式。 模板用于实现按注册转换。 有关详细信息,请参阅模板。
请务必注意注册是暂时的。 与注册所包含的 PNS 句柄类似,注册会过期。 你可以在通知中心中将注册的生存时间最多设为 90 天。 此限制意味着必须定期对注册进行刷新,并且注册不应是重要信息的唯一存储。 卸载移动应用程序时,此自动过期还简化了清理过程。
注册必须包含每个设备/通道的最新 PNS 句柄。 由于只能在设备上的客户端应用程序中获取 PNS 句柄,因此管理注册的一种方法是直接在该客户端应用程序上进行。 另一方面,与标记相关的安全注意事项和业务逻辑可能要求你在应用程序后端中管理注册。 以下部分介绍这两种方法。
从设备管理注册
从客户端应用程序管理注册时,后端仅负责发送通知。 客户端应用程序会及时更新 PNS 句柄并将其注册到标记。 下图演示了此模式。
设备首先从 PNS 检索 PNS 句柄,然后直接向通知中心进行注册。 注册成功之后,应用后端即可发送以该注册为目标的通知。 有关如何发送通知的详细信息,请参阅路由和标记表达式。
请注意,在此情况下,将只使用“侦听”权限从设备访问通知中心。 有关详细信息,请参阅安全性。
以下代码使用通知中心 API 引用注册设备:
await hub.RegisterNativeAsync(channelUri, tags);
[hub registerNativeWithDeviceToken:deviceToken tags:nil completion:^(NSError* error) {
if (error != nil) {
NSLog(@"Error registering for notifications: %@", error);
}
}];
hub.register(regid, tags);
这些方法为调用它们的设备创建或更新注册。 这意味着,若要更新句柄或标记,必须覆盖整个注册。 请记住,注册是暂时的,因此,你始终应使用具有特定设备所需的当前标记的可靠存储(设备上的本地存储或应用程序后端)。 有关如何更新注册的更详细示例,请参阅 “突发新闻” 教程。
还可以使用 REST API 从设备注册。 有关详细信息,请参阅 如何使用通知中心 REST 接口。
以下方案教程提供了有关从客户端注册的分步指导:
模板
如果要使用 模板,每个注册都表示单个模板。 这意味着,如果你的设备使用两个模板,则你必须使用模板自己的 PNS 句柄和标记集分别注册每个模板。
对于本机注册(即,不使用模板),模板的注册方法将创建或更新现有注册。 若要针对不同模板,请在注册时提供模板名称。 如果要为同一个设备维护多个模板,请提供不同名称。
重要
使用模板时,无需注册设备,如前一部分中所示。 仅在发送本机通知(以特定于平台的格式发送的通知)时,才会使用该注册。
以下代码使用通知中心 API 引用注册设备:
await hub.RegisterTemplateAsync(channelUri, template, templateName, tags);
[hub registerTemplateWithDeviceToken:deviceToken name:templateName jsonBodyTemplate: template expiryTemplate:nil tags:nil completion:^(NSError* error) {
if (error != nil) {
NSLog(@"Error registering for notifications: %@", error);
}
}];
hub.registerTemplate(regId, templateName, template, tags);
请注意,每个注册调用除了提供 PNS 句柄和可选的标记集外,还提供通知正文的模板和模板名称。 此外,每个平台都具有属于模板一部分的附加属性。 对于 Windows 应用商店(使用 WNS)和 Windows Phone 8(使用 MPNS),一组附加标头可以是模板的一部分。 对于 APNs,可以将过期属性设为常量或模板表达式。
有关如何修改这些模板字段的说明,请参阅 API 引用 或 通知中心 REST API。
Windows 应用商店应用的辅助磁贴
对于 Windows 应用商店客户端应用程序,将通知发送到辅助磁贴与将通知发送到主磁贴相同。 同时支持本机注册和模板注册。 唯一的区别是辅助磁贴具有一个不同的 ChannelUri,客户端应用程序上的 SDK 将以透明方式对其进行处理。
在高级别上,上一部分提供的所有信息都通过调用字典属性 Microsoft.WindowsAzure.Messaging.NotificationHub.SecondaryTiles 上公开的对象上的相应方法来处理辅助磁贴。 例如:
await hub.SecondaryTiles["myTileId"].RegisterNativeAsync(new string[] {"Yankees"});
await hub.SecondaryTiles["myTileId"].RegisterTemplateAsync(buildToastTemplate(), "toastTemplate", new string[] {"RedSox"});
SecondaryTiles 字典使用用于在 Windows Microsoft Store 应用中创建 SecondaryTiles 对象的同一 TileId。
与主 ChannelUri 一样,辅助磁贴的 ChannelUri 可随时更改。 为了使通知中心中的客户端应用程序注册保持更新,设备必须使用辅助磁贴的当前 ChannelUri 刷新这些注册。
注意
当应用程序处于非活动状态时,你可以删除辅助磁贴。 对应注册不会生成任何通知,并且将被通知中心自动删除。
从设备注册的缺点
从设备注册是最简单的方法,但存在一些缺点。
第一个缺点是客户端应用只能在它处于活动状态时更新其标记。 例如,如果用户有两台设备要注册与体育团队相关的标记,则当第一台设备注册附加标记(例如,Seahawks)时,第二台设备将不会收到有关 Seahawks 的通知,直到第二次在第二台设备上执行应用程序为止。 更概括地说,如果标记受多个设备的影响,则从后端管理标记是理想的选择。
从客户端应用管理注册的第二个缺点是,由于应用可能会受到攻击,因此保护特定标记的注册需要格外小心,如“标记级安全性”部分中所述。
从应用程序后端管理注册
从后端管理注册需要编写附加代码。 设备中的应用必须在每次应用 (启动时向后端提供更新的 PNS 句柄以及标记和模板) ,后端必须在服务总线更新此句柄。 下图演示了此设计。
从后端管理注册的优点是即使在设备上的相应应用程序处于非活动状态也能修改注册标记,并且在向其注册添加标记之前能够对客户端应用程序进行身份验证。
从应用后端可以对注册执行基本 CRUDS 操作。 例如:
var hub = NotificationHubClient.CreateClientFromConnectionString("{connectionString}", "hubName");
// create a registration description object of the correct type, e.g.
var reg = new WindowsRegistrationDescription(channelUri, tags);
// Create
await hub.CreateRegistrationAsync(reg);
// Get by id
var r = await hub.GetRegistrationAsync<RegistrationDescription>("id");
// update
r.Tags.Add("myTag");
// update on hub
await hub.UpdateRegistrationAsync(r);
// delete
await hub.DeleteRegistrationAsync(r);
此外,还可以使用节点或 REST API。
重要
后端必须处理注册更新之间的并发性。 服务总线为注册管理提供了乐观并发控制。 在 HTTP 级别,这是通过对注册管理操作使用 ETag 来实现的。 Microsoft SDK 以透明方式使用此功能,如果由于并发原因拒绝了更新,则会引发异常。 应用后端负责处理这些异常并在需要时重试更新。
其他资源
以下方案教程提供了有关从应用程序后端注册的分步指导: