google-cloud-messaging开始使用Google-cloud-messaging


备注

Google云消息传递:概述

Google Cloud Messaging(GCM)是一项免费服务,可让开发人员在服务器和客户端应用之间发送消息。这包括从服务器到客户端应用的下游消息,以及从客户端应用到服务器的上游消息。

例如,轻量级下游消息可以通知客户端应用程序从服务器获取新数据,如“新电子邮件”通知的情况。对于即时消息传递等用例,GCM消息可以将最多4kb的有效负载传输到客户端应用程序。 GCM服务处理消息排队以及与目标客户端应用程序之间的传递的所有方面。


建筑概述

GCM实施包括Google连接服务器,您环境中通过HTTP或XMPP协议与连接服务器交互的应用服务器以及客户端应用。

建筑概述

以下是这些组件的交互方式:

  • Google GCM连接服务器接受来自您的应用服务器的下游消息,并将其发送到客户端应用。 XMPP连接服务器还可以接受从客户端应用程序上游发送的消息,并将它们转发到您的应用服务器。有关更多信息,请参阅关于GCM连接服务器
  • App Server上 ,实现HTTP和/或XMPP协议以与GCM连接服务器通信。应用服务器将下游消息发送到GCM连接服务器;连接服务器将消息排队并存储,然后将其发送到客户端应用程序。如果您实施XMPP,您的应用服务器可以接收从客户端应用发送的消息。
  • 客户端应用程序是启用GCM的客户端应用程序。要接收和发送GCM消息,此应用程序必须向GCM注册并获取称为注册令牌的唯一标识符。有关如何实施客户端应用程序的更多信息,请参阅所用平台的文档。

关键概念

下面总结了GCM中涉及的关键术语和概念。它分为以下几类:

  • 组件 - 在GCM中起主要作用的实体。
  • 凭据 - GCM中使用的ID和令牌,用于确保所有方都已通过身份验证,并且消息将转到正确的位置。

GCM组件和凭据。

组件

  • GCM连接服务器 - 涉及在应用服务器和客户端应用之间发送消息的Google服务器。
  • 客户端应用程序 - 启用GCM的客户端应用程序,与您的应用服务器通信。
  • 应用程序服务器 - 您在实施GCM时编写的应用程序服务器。应用服务器通过GCM连接服务器将数据发送到客户端应用程序。如果您的应用服务器实现XMPP协议,它还可以接收从客户端应用上游发送的消息。

证书

  • 发件人ID
    配置API项目时创建的唯一数值。在注册过程中使用发件人ID来标识允许向客户端应用程序发送消息的应用服务器。

  • 服务器密钥
    保存在应用服务器上的密钥,可让应用服务器授权访问Google服务。在HTTP中,服务器密钥包含在发送消息的POST请求的标头中。在XMPP中,服务器密钥在SASL PLAIN身份验证请求中用作密码以验证连接。不要在客户端代码中的任何位置包含服务器密钥。您在创建API项目时获取服务器密钥。

  • 应用程序ID
    正在注册接收消息的客户端应用程序。如何实现这是依赖于平台的:

    • Android :使用应用清单中的包名称。
    • iOS :使用应用程序的包标识符。
    • Chrome :使用Chrome扩展程序名称。
  • 注册令牌
    GCM连接服务器向客户端应用程序发出的ID,允许它接收消息。请注意,注册令牌必须保密。


生命周期流程

  • 注册以启用GCM 。客户端应用程序的实例注册以接收消息。有关更多讨论,请参阅注册客户端应用程序
  • 发送和接收下游消息
    • 发送消息。应用服务器将消息发送到客户端应用:
      1. 应用服务器 GCM连接服务器发送消息
      2. 如果设备处于脱机状态,GCM连接服务器会将消息排入并存储。
      3. 当设备在线时,GCM连接服务器将消息发送到设备。
      4. 在设备上,客户端应用程序根据特定于平台的实现接收消息。有关详细信息,请参阅特定于平台的文档
    • 收到消息。客户端应用程序从GCM连接服务器接收消息。有关该环境中的客户端应用程序如何处理其收到的消息的详细信息,请参阅特定于平台的文档。
  • 发送和接收上游消息 。此功能仅在您使用XMPP连接服务器时可用。
    • 发送消息。客户端应用程序向应用服务器发送消息:
      1. 在设备上,客户端应用程序将消息发送到XMPP连接服务器。有关客户端应用程序如何通过XMPP发送消息的详细信息,请参阅特定于平台的文档。
      2. 如果服务器断开连接,XMPP连接服务器会将消息排入队列并存储。
      3. 重新连接应用服务器时,XMPP连接服务器会将消息发送到应用服务器。
    • 收到消息。应用服务器从XMPP连接服务器接收消息,然后执行以下操作:
      1. 解析邮件标头以验证客户端应用程序发件人信息。
      2. 将“ack”发送到XMPP连接服务器以确认接收消息。
      3. (可选)解析客户端应用程序定义的消息有效内容。

官方文档参考可以在这里找到。

处理Android中的下游消息

实现onMessageReceived ,它将捕获从GCM服务器发送的通知。

  @Override
  public void onMessageReceived(String from, Bundle data) {
     String message = data.getString("message");
     Log.d(TAG, "From: " + from);
     Log.d(TAG, "Message: " + message);
     // Handle received message here.
  }
 

处理iOS中的下游消息

要接收通知,请实现application:didReceiveRemoteNotification:fetchCompletionHandler:application:didReceiveRemoteNotification: application:didReceiveRemoteNotification:fetchCompletionHandler: for iOS <8.0),并调用GCMService:appDidReceiveMessage:message 以确认GCMService:appDidReceiveMessage:message 消息给GCM。

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo {
  NSLog(@"Notification received: %@", userInfo);
  // This works only if the app started the GCM service
  [[GCMService sharedInstance] appDidReceiveMessage:userInfo];
  // Handle the received message
  // ...
}

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))handler {
  NSLog(@"Notification received: %@", userInfo);
  // This works only if the app started the GCM service
  [[GCMService sharedInstance] appDidReceiveMessage:userInfo];
  // Handle the received message
  // Invoke the completion handler passing the appropriate UIBackgroundFetchResult value
  // ...
}
 

从云发送下游消息

使用GCM HTTP连接服务器协议发送消息:

  https://gcm-http.googleapis.com/gcm/send
  Content-Type:application/json
  Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
  {
    "to": "/topics/foo-bar",
    "data": {
      "message": "This is a GCM Topic Message!",
     }
  }
 

要在Postman中执行此操作,您只需设置以下内容( 一些详细信息如上所述 ):

  1. 将请求类型设置为POST
  2. 标题中 ,设置以下内容:
    • Content-Type = application / json
    • 授权= <您的GCM服务器密钥>
  3. Body中设置有效负载参数( 在本例中,我们使用raw选项,参见屏幕截图(2)
  4. 将请求发送至https://gcm-http.googleapis.com/gcm/send

截图:

(1) 在此处输入图像描述

(2) 在此处输入图像描述

请注意,响应中的message_id 请求成功。

PS:我保持示例服务器密钥可见,以便其他人仍然可以尝试,即使他们尚未创建项目。 但请注意,服务器密钥必须始终保密。