Google Cloud Messaging
警告
Google 自 2018 年 4 月 10 日起弃用了 GCM。 以下文档和示例项目可能不再受维护。 Google 的 GCM 服务器和客户端 API 将于 2019 年 5 月 29 日删除。 Google 建议将 GCM 应用迁移到 Firebase Cloud Messaging (FCM)。 有关 GCM 弃用和迁移的详细信息,请参阅 Google 已弃用的 Cloud Messaging。
若要开始将 Firebase Cloud Messaging 与 Xamarin 配合使用,请参阅 Firebase Cloud Messaging。
Google Cloud Messaging (GCM) 是一项辅助移动应用和服务器应用程序之间的消息传递的服务。 本文概述了 GCM 的工作原理,并介绍了如何配置 Google 服务,以便应用可以使用 GCM。
本主题简要概述了 Google Cloud Messaging 如何在应用与应用服务器之间路由消息,并逐步介绍了如何获取凭据以便应用可以使用 GCM 服务。
概述
Google Cloud Messaging (GCM) 是一项处理服务器应用程序和移动客户端应用之间的消息发送、路由和排队的服务。 客户端应用是启用了 GCM 的应用,可在设备上运行。 应用服务器(由你或你的公司提供)是启用了 GCM 的服务器,客户端应用可通过 GCM 与之通信:
使用 GCM,应用服务器可以将消息发送到单个设备、一组设备或订阅了某个主题的多个设备。 客户端应用可以使用 GCM 从应用服务器订阅下游消息(例如,接收远程通知)。 此外,客户端应用还可以通过 GCM 将上游消息发送回应用服务器。
运行中的 Google Cloud Messaging
当下游消息从应用服务器发送到客户端应用时,应用服务器会将消息发送到 GCM 连接服务器;反过来,GCM 连接服务器会将消息转发到运行客户端应用的设备。 消息可以通过 HTTP 或 XMPP 发送(可扩展消息传送和状态协议)。 由于客户端应用并不总是处于连接或运行状态,因此 GCM 连接服务器会让消息排队并将其存储起来,在客户端应用重新连接并可用时再将消息发送到客户端应用。 同样,如果应用服务器不可用,GCM 会将从客户端应用发送到应用服务器的上游消息排队。
GCM 使用以下凭据来标识应用服务器和客户端应用,并使用这些凭据来授权通过 GCM 进行的消息事务:
API 密钥 – API 密钥为应用服务器提供对 Google 服务的访问权限;GCM 使用此密钥对应用服务器进行身份验证。 在使用 GCM 服务之前,必须先通过创建项目,从 Google 开发者控制台获取 API 密钥。 应确保 API 密钥安全;有关如何保护 API 密钥的详细信息,请参阅安全使用 API 密钥的最佳做法。
发送方 ID – 发送方 ID 授权应用服务器向客户端应用发送信息,它是一个唯一的数字,用于标识允许向客户端应用发送消息的应用服务器。 发送方 ID 也是项目编号;可以在注册项目时从 Google 开发者控制台获取发送方 ID。
注册令牌 – 注册令牌是给定设备上客户端应用的 GCM 标识。 注册令牌在运行时生成 – 应用在设备上运行时,如果首次向 GCM 注册,则会收到注册令牌。 注册令牌授权客户端应用的实例(在特定设备上运行)接收来自 GCM 的消息。
应用程序 ID – 用于注册以从 GCM 接收消息的客户端应用标识(该标识独立于任何给定设备)。 在 Android 上,应用程序 ID 是 AndroidManifest.xml 中记录的包名称,例如
com.xamarin.gcmexample
。
设置 Google Cloud Messaging(本指南后面部分)提供了有关创建项目和生成这些凭据的详细说明。
以下部分介绍了当客户端应用通过 GCM 与应用服务器通信时如何使用这些凭据。
向 GCM 注册
设备上安装的客户端应用必须先在 GCM 中注册,然后才能进行消息传送。 客户端应用必须完成下图所示的注册步骤:
客户端应用联系 GCM 以获取注册令牌,将发送方 ID 传递给 GCM。
GCM 将注册令牌返回到客户端应用。
客户端应用将注册令牌转发到应用服务器。
应用服务器将缓存注册令牌,以便与客户端应用进行后续通信。 应用服务器可以选择将确认发送回客户端应用,以指示已收到注册令牌。 发生此握手后,客户端应用可以从应用服务器(或向其发送消息)接收消息。
当客户端应用不再想要从应用服务器接收消息时,它可以向应用服务器发送请求以删除注册令牌。 如果客户端应用正在接收主题消息(本文稍后介绍),它可以取消订阅该主题。 如果从设备中卸载客户端应用,GCM 会检测到此情况,并自动通知应用服务器删除注册令牌。
下游消息传送
当应用服务器向客户端应用发送下游消息时,会遵循下图所示的步骤:
应用服务器将消息发送到 GCM。
如果客户端设备不可用,GCM 服务器会将消息存储在队列中供以后传输。
当客户端设备可用时,GCM 会向该设备上的客户端应用发送消息。
客户端应用从 GCM 接收消息并进行相应的处理。 例如,如果消息是远程通知,则会向用户显示该消息。
在此消息传送方案中(应用服务器向单个客户端应用发送消息),消息长度可达 4kB。
有关在 Android 上接收下游 GCM 消息的详细信息(包括代码示例),请参阅远程通知。
主题消息传送
主题消息传送是一种下游消息传送类型,即应用服务器向订阅某个主题(例如天气预报)的多个客户端应用设备发送单个消息。 主题消息长度可达 2KB,主题消息传送支持每个应用最多 100 万个订阅。 如果 GCM 仅用于主题消息传送,则不需要客户端应用将注册令牌发送到应用服务器。
组消息传送
组消息传送是一种下游消息传送类型,即应用服务器向属于某个组的多个客户端应用设备(例如,属于单个用户的一组设备)发送单个消息。 对于 iOS 设备,组消息的长度可达 2KB,对于 Android 设备,长度最多为 4KB。 一个组最多只能有 20 个成员。
上游消息传送
如果客户端应用连接到支持 XMPP 的服务器,它可以将消息发送回应用服务器,如下图所示:
客户端应用向 GCM XMPP 连接服务器发送消息。
如果应用服务器断开连接,GCM 服务器会将消息存储在队列中供以后转发。
当应用服务器重新连接后,GCM 会将消息转发到应用服务器。
应用服务器会分析消息以验证客户端应用的标识,然后向 GCM 发送“ack”以确认收到消息。
应用服务器会处理该消息。
Google 的上游消息介绍了如何构建 JSON 编码的消息并将其发送到运行 Google 基于 XMPP 的云连接服务器的应用服务器。
设置 Google Cloud Messaging
在应用中使用 GCM 服务之前,必须先获取用于访问 Google GCM 服务器的凭据。 以下部分介绍了完成此过程所需的步骤:
为应用启用 Google 服务
使用 Google 帐户(即 gmail 地址)登录到 Google 开发者控制台并创建新项目。 如果已有项目,请选择想要启用 GCM 的项目。 在以下示例中,将创建一个名为 XamarinGCM 的新项目:
接下来,输入应用的包名称(在此示例中,包名称为 com.xamarin.gcmexample),然后单击“继续选择并配置服务”:
请注意,此包名称也是应用的应用程序 ID。
“选择并配置服务”部分列出了可添加到应用的 Google 服务。 单击“Cloud Messaging”:
接下来,单击“启用 GOOGLE CLOUD MESSAGING”:
系统会为应用生成“服务器 API 密钥”和“发送方 ID”。 记录下这些值,然后单击“关闭”:
保护 API 密钥 - 该密钥不得用于公共用途。 如果 API 密钥泄露,未经授权的服务器可以向客户端应用程序发布消息。 安全使用 API 密钥的最佳做法提供了用于保护 API 密钥的实用指南。
查看项目设置
可以随时登录到 Google Cloud 控制台并选择项目,以查看项目设置。 例如,在页面顶部的下拉菜单中选择项目(在此示例中,项目名称为 XamarinGCM),可查看发送方 ID。 发送方 ID 是项目编号,如以下屏幕截图所示(此处的发送方 ID 为 9349932736):
若要查看 API 密钥,请单击“API 管理器”,然后单击“凭据”:
其他阅读材料
总结
本文概述了 Google Cloud Messaging (GCM)。 其中介绍了用于标识和授权应用服务器和客户端应用之间的消息传送的各种凭据。 还演示了最常见的消息传送方案,并详细介绍了在 GCM 注册应用以使用 GCM 服务的步骤。