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

Сообщение weird push, полученное при запуске приложения

Я получаю странное push-сообщение, снятое моей службой push:

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

См. обновленные Документы API GCM, как предлагает @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);

Ответ 3

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

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

Ответ 4

Для существующих приложений, расширяющих 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

Ответ 5

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

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

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

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

Ответ 6

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

  • консоль firebase
  • воспроизводится запрос почтальона с запросом следующим образом:

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

Также я скопировал также весь код из google быстрый запуск сообщений firebase. Все должно быть хорошо. Однако после всех тестов я решил дважды проверить мои версии gradle libs. Поэтому я увеличил их до последних чисел. С тех пор я начал получать сообщения правильно.

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

Слухи о студии Android вызывают эту проблему, но это не так. Я проверил его.

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