我正在使用帶有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