我正在使用带有XMPP的Google Cloud Messaging以同时具有下游和上游消息。识别上游GCM消息的发件人
只有客户端通过我的工作线程这样得到令牌:
InstanceID instanceID = InstanceID.getInstance(this);
try {
String token = instanceID.getToken(getString(R.string.gcm_senderID), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
send_token(token, getString(R.string.gcm_senderID));
} catch (IOException e) {
e.printStackTrace();
}
然后我送过来此标记在那里收到的服务器。我可以使用此令牌将消息发送给客户端。
然后,我可以与此在客户端发送的上行消息:
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
String msg;
Bundle data = new Bundle();
data.putString("message", message);
try {
messenger.send(getString(R.string.gcm_senderID) + "@gcm.googleapis.com", messageId.addAndGet(1) + "", data);
} catch (IOException e) {
e.printStackTrace();
}
msg = "Sent message";
return msg;
}
}.execute(null, null, null);
在从客户端发送的上行消息时,有一个from
字段,这似乎是一个令牌,以及。如果我从服务器端发送消息给我,我的手机也会收到。
令我困惑的是from
字段中的令牌不等于InstanceID服务生成的令牌。
前18个字符左右是平等的,但在此之后他们是非常不同的。因此,是否有一种很好的方法来确定哪些设备发送了什么消息?
我可以在Bundle
中每次存储实例ID生成的令牌,但我想知道是否有任何方法可以使上游消息的from
字段与生成的ID保持一致。
编辑:使用已过时的register
函数,我能够获得一致的注册ID。
String token = GoogleCloudMessaging.getInstance().register(getString(R.string.gcm_senderID));
但有没有办法用InstanceID做到这一点?
上传消息仍然使用GoogleCloudMessaging API发送消息,因此预计它会使用GoogleCloudMessaging生成的注册ID作为其源(“from”对象)。此时,如果希望服务器以统一方式处理消息,则将实例ID令牌添加到Bundle看起来是最方便的事情。 – Koh
是的,它有一个生成的注册ID作为源是有道理的,但我不明白为什么它会为每个发送的上游消息使用新生成的注册ID,它是否不应该使用应用程序生成的注册ID? – Clark
https://developers.google.com/cloud-messaging/server-ref#upstream上的文档对上游XMPP消息的“from”字段进行了说明:“此参数指定由谁发送消息。 ** value“是客户端应用程序的注册标记**”从这里我明白它应该与什么instanceID.getToken(GCM_SENDER_ID,GoogleCloudMessaging.INSTANCE_ID_SCOPE)相同;返回,但事实并非如此。每一个消息有“来自”不同的除了第18个字符 – bitek