这不是我第一次想知道当应用程序处于后台时GCM / FCM是如何工作的。
现在我正在修改我的应用程序我意识到当应用程序处于后台时它没有收到data
消息,而前景中的应用程序很好地接收了相同的消息。
如果我安装Google Play中发布的版本,它在所有情况下都能正常运行。
如果我重新发布已发布的应用程序项目并重建它,则当应用程序处于后台时,不会收到FCM消息。那是一场噩梦。
所以我想知道FCM是否完全适用于未发布的应用程序!?!
我的消息是(从Advanced Rest Client测试):
{
"registration_ids": [
"feWpp3aQ8sQ:A...dclQ1hSttsf",
"feDmzDRi-gw:A...O9ur7oXi",
"f7dbqek_rPo:APA91bEu...a1rSje0bNmPq8"
],
"data": {
"id": 19,
"title": "Title test",
"msg": "Text of the test",
"code": 2,
"infosUrl": "www.myexample.com",
"eventLocation": "Nowhere",
"latitude": 47.90022515672,
"longitude": 15.0196307059377,
"startDate": "2016/05/14 20:00",
"endDate": "2016/05/14 22:00",
"publishEndDate": "",
"image": ""
},
"delay_while_idle": false,
"priority": "high",
"content_available": true
}
我的宣言:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.example"
android:installLocation="auto"
android:versionCode="52"
android:versionName="@string/app_version">
<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:logo="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
<activity
android:name=".PreferencesActivity"
android:label="@string/label_preferenceScreen"/>
<activity
android:name=".FragmentPreferences"
android:label="@string/label_preferenceScreen"/>
<service android:name=".MyFcmListenerService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service
android:name=".MyInstanceIDListenerService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
android:name=".RegistrationIntentService"
android:exported="false" />
</application>
我的傻瓜:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:support-v4:24.0.0'
compile 'com.android.support:support-annotations:24.0.0'
compile 'org.osmdroid:osmdroid-android:5.2@aar'
compile 'com.google.firebase:firebase-messaging:9.2.0'
compile 'com.google.android.gms:play-services-location:9.2.0'
compile 'com.google.android.gms:play-services-appindexing:9.2.0'
compile 'com.android.support:appcompat-v7:24.0.0'
}
apply plugin: 'com.google.gms.google-services'
听众:
public class MyFcmListenerService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage fcmMessage) {
Map data = fcmMessage.getData();
int code = Integer.parseInt((String) data.get("code"));
switch (code) {
case 1: // Event
....
break;
default:
break;
}
}
}
你遇到过这样的奇怪问题吗?
答案 0 :(得分:0)
它是否是发布/未发布的app以接收通知/消息无关紧要.fcm服务器需要的是有效的注册ID。 您的myFcmListenerService与com.google.firebase.MESSAGING_EVENT操作负责接收消息。这意味着您有意注册该服务,以便在发生特定操作时通知您/您的应用,因为只要您的应用处于后台,您的应用就会获得通知/消息。 MyInstanceIDListenerService负责接收您应用的注册ID。 使用GCM / FCM接收消息没有问题,无论您的应用是前台/后台。