应用程序启动时收到奇怪的推送消息

我收到推送服务捕获的一个奇怪的推送消息:

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

刚刚开始发生昨天,我不能真正发现哪个代码的变化是责怪这个。 有没有人见过这个消息,也许知道它来自哪里,为什么?

您的应用程序正在收到此消息,因为它已从备份中恢复数据。 由于备份可能包含注册令牌,所以会发送此广播,通知您的应用程序获取新令牌,因为备份的令牌不起作用。

这是针对新的GCM API的 ,它会导致您的InstanceIdListenerService实现的onTokenRefresh()方法被调用,您的应用程序应该再次获取其所有的标记。

不幸的是,如果你正在编写自己的BroadcastReceiver,这些消息将是意想不到的,并可能导致你的应用程序崩溃。 正确的做法是过滤“from”字段,如果您看到其中一条消息,请再次注册GCM,因为您的令牌可能无效。

如果您正在恢复全新的安装位置,而您的应用程序的数据正在恢复,请发送至android-gcm邮件列表。

请参阅@moreporkbuild议的更新的GCM API文档 。

对于扩展WakefulBroadcastReceiver的现有应用,Googlebuild议迁移到GCMReceiver和GcmListenerService。 迁移:

在应用清单中,用“com.google.android.gms.gcm.GcmReceiver”replace您的GcmBroadcastReceiver,并将扩展IntentService的当前服务声明replace为新的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); } } 

那么你可以用刚刚replace旧的注册码

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

我今天意识到同样的问题。 首先,这个消息必须来自谷歌本身(from = google.com / iid),否则from属性将是你的项目在谷歌开发者控制台(即475832179747)的ID。 但是可以肯定的是,我closures了我们的应用服务器,而且我仍然收到了这个消息。

当我在Google Cloud Messaging服务器上新注册时,我总是收到它。 这不是一个大问题,因为你可以通过intent-action来过滤消息,但我真的很想知道它的目的。

对于扩展WakefulBroadcastReceiver的现有应用,Googlebuild议迁移到GCMReceiver和GcmListenerService。 迁移:

  • 在应用清单中,用“com.google.android.gms.gcm.GcmReceiver”replace您的GcmBroadcastReceiver,并将扩展IntentService的当前服务声明replace为新的GcmListenerService
  • 从客户端代码中删除BroadcastReceiver实现
  • 重构当前IntentService服务实现以使用GcmListenerService有关详细信息,请参阅示例清单。

它似乎谷歌拆分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

至less在一台华硕平板电脑上,同样的事情发生在我身上

可能在更多的设备上,但我没有机会去看看

我在Intent.getExtras()中寻找一些特定的string,所以修复很简单,如果他们不存在,那么忽略整个事情。

Google有什么机会出现并解释发生了什么?

在迁移GCM-> FCM的时候,我遇到了这个问题,只wakelockid来自以下地址的wakelockid元素:

  • Firebase控制台
  • 请求邮递员请求这样的请求:

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

此外,我也复制谷歌quickstart firebase消息的所有代码。 一切都应该没问题。 但是,在所有testing之后,我决定再次检查我的gradle库版本。 所以我把它们递增到最新的数字。 从那时起,我开始正确接收消息。

我build议从GitHub下载最快的解决scheme,并尝试这是否适合您。 下一步就是将这段代码复制到你的项目中。 如果在一个项目中一切正常,至less有一个站点/工作点可以开始。

有关于android studio的传言正在引发这个问题 – 但事实并非如此。 我检查了它。

可以是真的,你可以使用相同的旧标记(从gcm),而不是接收消息,但如果你有像我一样的migrating情况下,那么令牌应该刷新到新的,你应该处理它..