2015-06-09 34 views
3

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

+0

上传消息仍然使用GoogleCloudMessaging API发送消息,因此预计它会使用GoogleCloudMessaging生成的注册ID作为其源(“from”对象)。此时,如果希望服务器以统一方式处理消息,则将实例ID令牌添加到Bundle看起来是最方便的事情。 – Koh

+0

是的,它有一个生成的注册ID作为源是有道理的,但我不明白为什么它会为每个发送的上游消息使用新生成的注册ID,它是否不应该使用应用程序生成的注册ID? – Clark

+0

https://developers.google.com/cloud-messaging/server-ref#upstream上的文档对上游XMPP消息的“from”字段进行了说明:“此参数指定由谁发送消息。 ** value“是客户端应用程序的注册标记**”从这里我明白它应该与什么instanceID.getToken(GCM_SENDER_ID,GoogleCloudMessaging.INSTANCE_ID_SCOPE)相同;返回,但事实并非如此。每一个消息有“来自”不同的除了第18个字符 – bitek

回答

0

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

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

我已经回答,而不是评论与谷歌开发商看到这个虚妄的希望。

+0

谷歌已经承认他们已经有一个公开的问题并且正在努力。 – ballzak