使用 Google Cloud Messaging 发送广播通知

Posted

技术标签:

【中文标题】使用 Google Cloud Messaging 发送广播通知【英文标题】:Sending a broadcast notification with Google Cloud Messaging 【发布时间】:2012-07-13 10:13:22 【问题描述】:

我正在使用 Google Cloud Messaging 提供推送通知。我可能需要向大约 10.000 个用户发送广播通知。但是,我读到一条多播消息可以包含一个最多包含 1000 个注册 ID 的列表。

那么,我需要发送十个多播消息吗?有没有办法在不生成包含所有 id 的列表的情况下向所有客户端发送广播?

提前感谢。

【问题讨论】:

【参考方案1】:

从 Play Services 7.5 开始,现在也可以通过主题来实现:

https://developers.google.com/cloud-messaging/topic-messaging

注册后,您必须通过 HTTP 向 GCM 服务器发送消息:

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!",
  

例如:

JSONObject jGcmData = new JSONObject();
JSONObject jData = new JSONObject();
jData.put("message", "This is a GCM Topic Message!");
// Where to send GCM message.
jGcmData.put("to", "/topics/foo-bar");

// What to send in GCM message.
jGcmData.put("data", jData);

// Create connection to send GCM Message request.
URL url = new URL("https://android.googleapis.com/gcm/send");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Authorization", "key=" + API_KEY);
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestMethod("POST");
conn.setDoOutput(true);

// Send GCM message content.
OutputStream outputStream = conn.getOutputStream();
outputStream.write(jGcmData.toString().getBytes());

您的客户应该订阅 /topics/foo-bar :

public void subscribe() 
   GcmPubSub pubSub = GcmPubSub.getInstance(this);
   pubSub.subscribe(token, "/topics/foo-bar", null);


@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.

【讨论】:

【参考方案2】:

您别无选择,只能将广播分成最多 1000 个 regId 的块。

然后您可以在单独的线程中发送多播消息。

        //regIdList max size is 1000
        MulticastResult multicastResult;
        try 
            multicastResult = sender.send(message, regIdList, retryTimes);
         catch (IOException e) 
            logger.error("Error posting messages", e);
            return;
        

【讨论】:

以上是关于使用 Google Cloud Messaging 发送广播通知的主要内容,如果未能解决你的问题,请参考以下文章

GCM(Google Cloud Messaging)是不是需要 Google 帐户?

Google-Cloud-Messaging服务的可靠性

使用 Google Cloud Messaging 发送广播通知

Google Cloud Messaging现在是否在Google中被阻止?

在新的 Google Cloud Messaging 上取消注册

特定设备未收到 Google Cloud Messaging 通知