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

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

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

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

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

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

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

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

См. Обновленные документы 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); 

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

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

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

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

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

 <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

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

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

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

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