GCM 是如何工作的? (适用于 Android 的谷歌云消息传递)

Posted

技术标签:

【中文标题】GCM 是如何工作的? (适用于 Android 的谷歌云消息传递)【英文标题】:How does GCM work ? (google cloud messaging for Android) 【发布时间】:2014-05-24 12:51:34 【问题描述】:

我有一个 android 应用程序,我使用 REST API(django rest 框架)连接到我的服务器

这是一个场景(也许是我的计划):

数据以 json 格式来回发送 我有一个用户模型和一个任务模型,其中用户是某些任务的所有者。 用户通常将任务发送给另一个用户(使用类似于此的 json:"owner":"exampleuser", "from":"otheruser", "content":"example" ... 使用 POST 方法) - 任务有一个布尔字段“已完成”,一旦任务完成就会被删除(使用 PUT 或 PATCH 方法:完成 = true,) 一旦使用 POST 方法创建了一个新任务,用户可以看到与他们的任务相关的任何活动的唯一方法是通过一个使用 GET 方法的 android 活动来获取用户拥有的所有任务的列表,通过查找所有用户拥有的对象

所以我的问题是:

    而不是让用户每次都检查应用程序。如何使用 GCM 推送通知用户? 它将如何判断将推送通知发送给哪个用户或设备? GCM 如何知道任务何时发生更改或用户何时发布任务?

【问题讨论】:

【参考方案1】:

Android 与 Google 的服务器保持一个活动连接,但它不会使用太多电力或数据,因为在有东西向您手机上的应用程序发送 GCM 消息之前,不会有任何流量沿着它发送。手机上只有一个连接,供所有应用使用:安装使用 GCM 的新应用不会增加任何额外负载。

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

使用推送通知的优势在于应用不必定期运行以检查新数据,从而节省电量和数据。拥有像 GCM 这样的中心化机制的好处是设备只需要一个开放的网络连接,而 Android GCM 系统是唯一需要保持运行的东西,而不是每个应用程序都必须在后台保持运行以保持自己的网络连接到自己的服务器。

【讨论】:

感谢您的信息。根据my question,你知道打开的socket的URL是什么吗? (从设备到 GCM 服务器的连接 URL,已打开并用于通知数据)【参考方案2】:

根据GCM 实现,它要求 实现一个远程服务器,该服务器将管理所有请求,包括传入和传出。您可以简单地使用充当 Web 服务的 Web 服务器来执行此操作,该服务器将(例如)通过 HTTP POST 请求从客户端获取请求,然后处理相应的操作。

而不是让用户每次都检查应用程序。如何使用 GCM 推送通知用户?

这将由我刚才描述的服务器管理。它会知道谁订阅了,谁应该收到通知。

它将如何告诉将推送通知发送给哪个用户或设备?

这里也一样。服务器在订阅后应该将用户存储在某种存储中(例如 SQL 数据库),这样它就会知道向谁发送通知。这意味着您必须实现一些超时机制。就我而言,我让客户端每 30 秒发送一次dummy HTTP POST。如果我在合理的时间内没有收到此请求,我认为客户端超时,因此我将它们从数据库中删除。

GCM 如何知道任务何时发生更改或用户何时发布任务?

同样的故事,这一切都由服务器处理。 实现任何请求应发生的逻辑。

您可能想阅读以下内容:How to send location of the device on server when needed

还有这个参考:

参考Google Cloud Messaging

Android Push Notifications using Google Cloud Messaging GCM - Android Example

Google Cloud Messaging using php

Connection between PHP (server) and Android (client) Using HTTP and JSON

Notificaciones Push Android: Google Cloud Messaging (GCM). Implementación Cliente (Nueva Versión)(西班牙语)

【讨论】:

当应用程序可能未运行时,GCM 如何将来自服务器的消息转换为 Intent?执行此关键步骤的 Android 上运行的哪些无法被杀死(即,只要有消息可能会一直运行),所以我的应用程序由 Intent 启动?

以上是关于GCM 是如何工作的? (适用于 Android 的谷歌云消息传递)的主要内容,如果未能解决你的问题,请参考以下文章

适用于 Android 谷歌云消息 (GCM) 的 Azure 移动服务从不向设备发送通知

如何在推送通知 (GCM) android 中发送图像?

拦截所有 GCM 推送消息(适用于任何应用程序)

如何设置适用于 Android 的 Google Cloud Messaging?

从应用服务器接收 GCM 推送通知消息的步骤

使用 GCM 的 Android 聊天应用程序如何工作?