2015-06-09 2 views
3

Я использую 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?

+0

Служба обмена сообщениями по-прежнему использует API GoogleCloudMessaging для отправки сообщений, поэтому ожидается, что в качестве источника (объект «from») будет использоваться идентификатор регистрации, созданный GoogleCloudMessaging. На данный момент, похоже, добавление токена идентификатора экземпляра в Bundle - самая удобная вещь для вас, если вы хотите, чтобы ваш сервер обрабатывал сообщения в единой форме. – Koh

+0

Да, имеет смысл, что у него есть сгенерированный идентификатор регистрации в качестве источника, но я не понимаю, почему он использует только что сгенерированный идентификатор регистрации для каждого отправленного отправленного сообщения, не следует ли использовать идентификатор регистрации, сгенерированный приложением? – Clark

+0

Документы на странице https://developers.google.com/cloud-messaging/server-ref#upstream сообщают об этом в поле «from» восходящего XMPP-сообщения: «Этот параметр указывает, кто отправил сообщение. ** Значение - это токен регистрации клиентского приложения. ** «Из этого я понимаю, что он должен быть таким же, как instanceID.getToken (GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE); вернулся, но это не так.Каждое сообщение имеет разные «от», за исключением первых 18 символов – bitek

ответ

0

Вызов GoogleCloudMessaging.getInstance (контекст) .register (senderId) вместо getToken (senderId, «GCM»), похоже, устраняет проблему, тогда сервер XMPP получит правильный токен, каждый раз, в «от», свойство восходящего сообщения.

У меня есть устройство CyanogenMod, поэтому приложение Службы Google Play не обновляется автоматически. Поскольку старый register() работает, эта проблема, скорее всего, вызвана ошибкой в ​​google-play-services_lib при разговоре с более старой версией приложения GMS.

Я ответил вместо комментариев с тщетными надежды на то, что Google видит это.

+0

Google признал, что у них есть открытая проблема и она работает над этим. – ballzak

Смежные вопросы