Подтвердить что ты не робот

Android SDK получает NotRegistered ошибку от GCM через несколько часов

Проблема

Я пишу и Android SDK, который должен получать push-сообщения GCM со стороны сервера SDK. После нескольких часов успешной отправки push-сообщений сервер GCM возвращает ошибку NotRegistered:

{
    "multicast_id":6205350692941230304,
    "success":0,
    "failure":1,
    "canonical_ids":0,
    "results":
    [
        {
            "error":"NotRegistered"
        }
    ]
}

registrationId у клиента не изменился, а на стороне сервера обновлен этот токен.

Как я могу исправить проблему registrationId? Имеет ли двух слушателей - один в SDK, один в приложении - проблема?

Архитектура

Мой Android SDK регистрирует GCM regId при инициализации и отправляет этот идентификатор серверу, поддерживающему SDK.

Обширное приложение может (и обычно) регистрировать GCM regId самостоятельно. Другой regId, вероятно, отправляется на охватывающий сервер приложений.

senderId для SDK и приложения разные.

Реализация

манифеста

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> ...

    <receiver
        android:name="com.xxxx.xxxxx.xxxxx"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </receiver>

Регистрационный код

protected String doInBackground(Void... params) {
    String msg = "";
    try {
        if (gcm == null) {
            gcm = GoogleCloudMessaging.getInstance(mContext);
        }
        regid = gcm.register(SENDER_ID);
        msg = "Device registered, registration ID=" + regid;
        storeRegistrationId(mContext, regid);
        listener.onGCMRegisterFinish(regid);
    } 
    catch (IOException ex) 
    {
        msg = "Error :" + ex.getMessage();
    }
    return msg;
}

Этот код получает regId с сервера GCM и отправляет его на наш серверный сервер. Он выполняется при инициализации SDK, а regId отправляется каждый раз, когда приложение возвращается из фона.

Примечания

  • unregister() не вызывается, ни с сервера, ни с клиентской стороны
  • Я поднимаю тост с идентификатором регистрации каждый раз в то время, поэтому я могу проверить, что он одинаковый между клиентом и сервером:
Сторона клиента

введите описание изображения здесь

Серверная сторона
2015-08-02 12:31:22,383 INFO - request_2145354041215926507 
                        update push token for user: XXXXXXXX,
                        push_token: ...me1GttmSRipnWsCGVUueK7e0nk
4b9b3361

Ответ 1

Добавить категорию с именем вашего пакета в intent-filter

  <receiver
        android:name=".xxxxx"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <!-- Receives the actual messages. -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.xxxx" />
        </intent-filter>
    </receiver>

Ответ 2

Генерация идентификатора регистрации включает в себя не только устройство, но и приложение и идентификатор отправителя. Если я правильно понял вашу архитектуру, вы хотите внедрить GCM-клиент-библиотеку (ваш SDK), позволяющий вашему приложению использовать GCM через вашу библиотеку? Если это правда, убедитесь, что вы регистрировались только раз

Отказ от SDK и приложения отличается

Я предполагаю, что это проблема, вам необходимо зарегистрировать каждое приложение с идентификатором отправителя (например, XYZ) и использовать идентификатор SAME sender на сервере для отправки уведомления. Невозможно использовать ABC в качестве идентификатора отправителя для отправки уведомлений на устройство, зарегистрированное для идентификатора отправителя XYZ