it-swarm.com.ru

При запуске приложения получено странное Push-сообщение

Я получаю странное Push-сообщение, захваченное моей службой Push:

Bundle[{CMD=RST_FULL, from=google.com/iid, Android.support.content.wakelockid=1}]

Только вчера началось, и я не могу точно определить, в чём виновата смена кода. Кто-нибудь видел это сообщение раньше и, возможно, знает, откуда оно и почему?

55
vkislicins

Ваше приложение получает это сообщение, потому что оно восстановило данные из резервной копии. Поскольку резервная копия могла включать регистрационные токены, эта передача отправляется с указанием вашему приложению получить новые токены, поскольку резервные копии не будут работать.

Это предназначено для новых GCM APIs , и это вызовет вызов метода onTokenRefresh () вашей реализации InstanceIdListenerService, где ваше приложение должно снова получить все свои токены.

К сожалению, если вы пишете свой собственный BroadcastReceiver, эти сообщения будут неожиданными и могут привести к сбою приложения. Правильно сделать это, отфильтровав поле «от», и, если вы видите одно из этих сообщений, снова зарегистрироваться в GCM, поскольку ваши токены могут быть недействительными.

Если вы получаете эти сообщения вне ситуации новой установки, когда данные вашего приложения восстанавливаются, отправьте сообщение в список рассылки Android-gcm .

20
morepork

Смотрите обновленные Документы GCM API , как предлагает @morepork.

Для существующих приложений, которые расширяют WakefulBroadcastReceiver, Google рекомендует выполнить миграцию на GCMReceiver и GcmListenerService. Для мигрировать:

В манифесте приложения замените ваш GcmBroadcastReceiver на «com.google.Android.gms.gcm.GcmReceiver» и замените текущее объявление службы, расширяющее IntentService, на новый GcmListenerService.

Удалите реализацию BroadcastReceiver из вашего клиентского кода

Рефакторинг текущей реализации службы IntentService для использования GcmListenerService

Подробнее см. Пример манифеста и примеры кода на этой странице.

Из их примера кода это довольно легко понять.

AndroidManifest.xml

<receiver
    Android:exported="true"
    Android:name="com.google.Android.gms.gcm.GcmReceiver"
    Android:permission="com.google.Android.c2dm.permission.SEND">
    <intent-filter>
        <action Android:name="com.google.Android.c2dm.intent.RECEIVE"/>
        <category Android:name="com.example.client"/>
    </intent-filter>
</receiver>

<service
    Android:name=".MyGcmListenerService"
    Android:exported="false">
    <intent-filter>
        <action Android:name="com.google.Android.c2dm.intent.RECEIVE"/>
    </intent-filter>
</service>

<service
    Android:name=".MyInstanceIdListenerService"
    Android:exported="false">
    <intent-filter>
        <action Android:name="com.google.Android.gms.iid.InstanceID"/>
    </intent-filter>
</service>

<service
    Android:name=".MyGcmRegistrationService"
    Android:exported="false">
</service>

MyGcmListenerService.Java

public class MyGcmListenerService extends GcmListenerService {
    @Override
    public void onMessageReceived(String from, Bundle data) {
        final String message = data.getString("message");
        makeNotification(message);
    }
}

MyGcmRegistrationService.Java

public class MyGcmRegistrationService extends IntentService {
    private static final String TAG = "MyRegistrationService";
    private static final String GCM_SENDER_ID = "XXXXXXXXXXXX";
    private static final String[] TOPICS = {"global"};

    public MyGcmRegistrationService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        try {
            synchronized (TAG) {
                InstanceID instanceID = InstanceID.getInstance(this);
                String token = instanceID.getToken(GCM_SENDER_ID,
                        GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
                sendTokenToServer(token);
                subscribeTopics(token);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void subscribeTopics(String token) throws IOException {
        for (String topic : TOPICS) {
            GcmPubSub pubSub = GcmPubSub.getInstance(this);
            pubSub.subscribe(token, "/topics/" + topic, null);
        }
    }
}

MyInstanceIdListenerService.Java

public class MyInstanceIdListenerService extends InstanceIDListenerService {
    public void onTokenRefresh() {
        Intent intent = new Intent(this, MyGcmRegistrationService.class);
        startService(intent);
    }
}

Тогда вы можете заменить свой старый регистрационный код просто

Intent intent = new Intent(this, MyGcmRegistrationService.class);
startService(intent);
13
mpkuth

Я понял ту же проблему сегодня. Во-первых, это сообщение должно исходить от самого Google (from = google.com/iid), в противном случае атрибут from будет идентификатором вашего проекта в консоли разработчика Google (т.е. 475832179747). Но чтобы быть уверенным, я выключил наш сервер приложений, и я все еще получил сообщение.

Я всегда получаю его при новой регистрации на сервере Google Cloud Messaging. Это не большая проблема, потому что вы можете отфильтровать сообщение по намерению-действию, но мне бы очень хотелось узнать его цель.

7
rickul

Для существующих приложений, которые расширяют WakefulBroadcastReceiver, Google рекомендует выполнить миграцию на GCMReceiver и GcmListenerService. Для мигрировать:

  • В манифесте приложения замените ваш GcmBroadcastReceiver на «com.google.Android.gms.gcm.GcmReceiver» и замените текущий объявление сервиса, которое расширяет IntentService до нового GcmListenerService
  • Удалите реализацию BroadcastReceiver из вашего клиентского кода
  • Рефакторинг текущей реализации службы IntentService для использования GcmListenerService Подробнее см. В примере манифеста.

похоже, Google разделил GCMIntentService, который расширил IntentService для обработки gcms, до двух сервисов, один расширяет GcmListenerService, который будет обрабатывать полученные сообщения, и другой, который отдельно фильтрует iid.InstanceID, чтобы отфильтровать это уведомление, полученное для первой установки, Это от нового gcm Руководства по Android

<service
    Android:name="com.example.MyGcmListenerService"
    Android:exported="false" >
    <intent-filter>
        <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
    </intent-filter>
</service>
<service
    Android:name="com.example.MyInstanceIDListenerService"
    Android:exported="false">
    <intent-filter>
        <action Android:name="com.google.Android.gms.iid.InstanceID"/>
    </intent-filter>
</service>

https://developers.google.com/cloud-messaging/Android/client

2
nosaiba darwish

У меня была эта проблема при переносе GCM-> FCM с получением только элемента wakelockid из:

  • пожарная консоль
  • воспроизведенный запрос почтальона с таким запросом:

{ "to": "<your token from FirebaseInstanceId.getInstance().getToken()>", "notification": { "body": "Hello", "title": "This is test message." } }

Кроме того, я скопировал также весь код из Google Быстрый старт FireBase сообщений . Все должно быть хорошо. Тем не менее, после всех тестов я решил перепроверить мои версии gradle libs. Поэтому я увеличил их до последних номеров. С тех пор я начал получать сообщения правильно.

Самое быстрое решение, которое я бы порекомендовал скачать проект с GitHub и попробовать, если это работает для вас. Следующим шагом будет копирование этого кода в Ваш проект. Если в одном проекте все работает нормально, у вас есть хотя бы одна постоянная/рабочая точка, с которой нужно начинать.

Ходят слухи, что Android-студия вызывает эту проблему - но это не так. Я проверил это.

Может быть так, что вы могли бы использовать тот же старый токен (из gcm) и не получать сообщения, но если у вас был такой же случай, как у меня, migrating, то токен должен быть обновлен до нового, и вы должны обработать его ..

0
deadfish

то же самое происходит со мной по крайней мере на планшете Asus

скорее всего, на нескольких устройствах, но у меня не было возможности взглянуть

я ищу некоторые конкретные строки в Intent.getExtras (), поэтому исправление было простым, если их нет, то проигнорируйте все это.

каковы шансы, что кто-то из Google появится и объяснит, что происходит?

0
user1126515