GoogleCloudMessaging Android

时间:2013-08-02 10:31:58

标签: android push-notification google-cloud-messaging

使用新的GoogleCloudMessaging API实现上游消息时我很困惑:

public void onClick(final View view) {
    if (view == findViewById(R.id.send)) {
        new AsyncTask() {
            @Override
            protected String doInBackground(Void... params) {
                String msg = "";
                try {
                    Bundle data = new Bundle();
                    data.putString("hello", "World");
                    String id = Integer.toString(msgId.incrementAndGet());
                    gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data);
                    msg = "Sent message";
                } catch (IOException ex) {
                    msg = "Error :" + ex.getMessage();
                }
                return msg;
            }

            @Override
            protected void onPostExecute(String msg) {
                mDisplay.append(msg + "\n");
            }
        }.execute(null, null, null);
    } else if (view == findViewById(R.id.clear)) {
        mDisplay.setText("");
    } 
}

我们使用SENDER_ID ID将消息(XMPP)发送到GCM服务器,那么我的第三方服务器如何仅使用SENDER_ID识别我的设备?

gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data);

1 个答案:

答案 0 :(得分:2)

您发布的代码会将消息从您的设备发送到第三台服务器,而不是另一台设备。您的服务器应与Cloud Connection Server建立连接,并且由于建立该连接需要使用SENDER_ID + "@gcm.googleapis.com"作为用户名,因此GCM服务器可以识别您的第三方服务器。

当您的第三方服务器向您的设备发送消息时,它会使用注册ID,该ID可识别特定设备上的应用。

编辑:

我可能误解了你的问题。如果您询问第三方服务器如何知道哪个设备向其发送了上游消息,则第三方服务器收到的消息中包含发件人的注册ID,如您所见:

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "category":"com.example.yourapp", // to know which app sent it
      "data":
      {
          "hello":"world",
      },
      "message_id":"m-123",
      "from":"REGID"
  }
  </gcm>
</message>

即使您在呼叫gcm.send(...)时未指定注册ID,GCM也知道哪个设备发送了该消息,因此(假设您的应用已注册到GCM并因此具有注册ID),他们可以添加注册消息的ID(我不确定他们是否在连接GCM服务器之前在客户端添加它,或者如果在GCM服务器上添加它,但它并不重要)。