识别上游GCM消息的发件人

时间:2015-06-09 19:26:06

标签: android google-cloud-messaging

我正在使用带有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做到这一点?

1 个答案:

答案 0 :(得分:0)

调用GoogleCloudMessaging.getInstance(context).register(senderId)而不是getToken(senderId,“GCM”)似乎解决了这个问题,然后XMPP服务器每次都会在“from”属性中收到正确的令牌上游消息。

我的设备正在运行CyanogenMod,因此Google Play服务应用不会自动更新。由于旧的register()有效,这个问题很可能是因为google-play-services_lib与旧版本的GMS应用程序交谈时出现错误。

我已经回答了评论而不是谷歌开发人员看到这一点的徒劳希望。