GCM如何工作?(适用于Android的Google Cloud Messaging)

7

我有一个安卓应用程序,使用REST API(django rest framework)连接到我的服务器。

以下是场景(也许是我的计划):

  • 数据以json格式发送和接收
  • 我有一个用户模型和一个任务模型,其中用户是某些任务的所有者。
  • 通常情况下,用户会使用POST方法向另一个用户发送任务(使用类似于此的json:{"owner": "exampleuser", "from":"otheruser", "content":"example" ...})- 任务具有布尔字段“completed”,并且任务完成后将被删除(使用PUT或PATCH方法:completed = true)
  • 一旦使用POST方法创建了新任务,用户可以通过使用GET方法获取由用户拥有的所有任务列表的安卓活动来查看与其任务相关的任何活动,方法是查找用户拥有的所有对象。

所以我的问题是:

  1. 如何使用GCM推送通知用户,而不是让用户每次都要检查应用程序?
  2. 它如何确定向哪个用户或设备发送推送通知?
  3. GCM如何知道任务发生变化或用户发布任务?
2个回答

33

Android与Google服务器保持一条活动连接,但在没有收到GCM消息之前不会发送任何数据,因此不会消耗太多电力和数据。这个连接是所有应用程序共用的唯一连接:安装使用GCM的新应用程序不会增加任何额外的负荷。

GCM的第一步是第三方服务器(比如邮件服务器)向Google的GCM服务器发送请求。然后,该服务器通过那个开放的连接将消息发送到您的设备。Android系统查看消息以确定它所属的应用程序,并启动该应用程序。应用程序必须在Android上注册使用GCM,并具有相关权限。当应用程序启动时,它可能会立即使用消息中的数据创建通知。由于GCM消息的大小非常有限,因此应用程序可能会打开一个普通连接到第三方服务器以获取更多信息(例如下载新电子邮件的标题)。

使用推送通知的优点是应用程序无需定期运行以检查新数据,从而节省电力和数据。使用像GCM这样的集中式机制的优点是设备只需要一个开放的网络连接,并且Android GCM系统是唯一需要持续运行的东西,而不是每个应用程序都必须保持在后台运行以保持其自己的与服务器的网络连接。


感谢提供信息。根据我的问题,您知道已打开套接字的URL是什么吗?(设备到GCM服务器的连接的URL,用于通知数据) - Vahid

7
根据GCM的实现,需要您实现一个远程服务器来管理所有请求,包括进入和离开的请求。您可以通过将Web服务器充当Web服务来简单地完成此操作,例如使用HTTP POST请求从客户端获取请求,并相应地进行处理。
“而不是让用户每次都检查应用程序。我如何使用GCM向用户推送通知?”
这将由我刚才描述的服务器来管理。它将知道谁已订阅以及谁应该接收通知。
“它将如何告诉哪个用户或设备发送推送通知?”
同样,在此处也是一样的。服务器在订阅时,应将用户存储在某种存储中(例如SQL数据库),这样它就知道要发送通知给谁。这意味着您将不得不实现一些超时机制。在我的情况下,我让客户端每30秒发送一个虚拟的HTTP POST。如果我在合理的时间内没有收到此请求,则认为客户端已超时,因此我会将其从数据库中删除。
“GCM如何知道任务发生了更改或用户POST任务时?”
同样的故事,这都由服务器处理。您实现任何请求时应该发生的逻辑。
您可能想阅读以下内容:如何在需要时将设备位置发送到服务器 还有这些参考资料:
- Google云消息传递的参考 - 使用Google云消息传递GCM的Android推送通知-Android示例 - 使用PHP的Google云消息传递 - PHP(服务器)与Android(客户端)之间的连接,使用HTTP和JSON - Android推送通知:Google Cloud Messaging(GCM)。客户端实现(新版本)(西班牙语)

3
当应用程序可能没有运行时,GCM 如何将服务器上的消息转换为 Intent?在 Android 上有什么不能被杀死的东西(即每当消息可能到达时都会一直运行)来执行这个关键步骤,使得我的应用程序可以通过 Intent 启动? - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接