Я использую Google Cloud Messaging с XMPP, чтобы иметь как потоковое, так и восходящее сообщение.Идентификация отправителя сообщения 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
, но мне было интересно, может ли быть способ сделать поле from
восходящего сообщения согласованным с сгенерированным идентификатором.
Редактировать: Используя устаревшую функцию register
, я смог получить согласованный идентификатор регистрации.
String token = GoogleCloudMessaging.getInstance().register(getString(R.string.gcm_senderID));
Но есть ли способ сделать это с помощью InstanceID?
Служба обмена сообщениями по-прежнему использует API GoogleCloudMessaging для отправки сообщений, поэтому ожидается, что в качестве источника (объект «from») будет использоваться идентификатор регистрации, созданный GoogleCloudMessaging. На данный момент, похоже, добавление токена идентификатора экземпляра в Bundle - самая удобная вещь для вас, если вы хотите, чтобы ваш сервер обрабатывал сообщения в единой форме. – Koh
Да, имеет смысл, что у него есть сгенерированный идентификатор регистрации в качестве источника, но я не понимаю, почему он использует только что сгенерированный идентификатор регистрации для каждого отправленного отправленного сообщения, не следует ли использовать идентификатор регистрации, сгенерированный приложением? – Clark
Документы на странице https://developers.google.com/cloud-messaging/server-ref#upstream сообщают об этом в поле «from» восходящего XMPP-сообщения: «Этот параметр указывает, кто отправил сообщение. ** Значение - это токен регистрации клиентского приложения. ** «Из этого я понимаю, что он должен быть таким же, как instanceID.getToken (GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE); вернулся, но это не так.Каждое сообщение имеет разные «от», за исключением первых 18 символов – bitek