Сообщение weird push, полученное при запуске приложения
Я получаю странное push-сообщение, снятое моей службой push:
Bundle[{CMD=RST_FULL, from=google.com/iid, android.support.content.wakelockid=1}]
Только что началось вчера, и я не могу понять, какое изменение кода виновато в этом. Кто-нибудь видел это сообщение раньше и, возможно, знает, откуда он и почему?
Ответы
Ответ 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
, то токен должен быть обновлен до нового, и вы должны обращаться это..