2015-06-09 72 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