我正在使用带有XMPP的Google Cloud Messaging,以便同时收到下游和上游消息。
只有客户端我通过在工作线程上执行此操作获得令牌:
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做到这一点?
答案 0 :(得分:0)
调用GoogleCloudMessaging.getInstance(context).register(senderId)而不是getToken(senderId,“GCM”)似乎解决了这个问题,然后XMPP服务器每次都会在“from”属性中收到正确的令牌上游消息。
我的设备正在运行CyanogenMod,因此Google Play服务应用不会自动更新。由于旧的register()有效,这个问题很可能是因为google-play-services_lib与旧版本的GMS应用程序交谈时出现错误。
我已经回答了评论而不是谷歌开发人员看到这一点的徒劳希望。