同一Firebase项目下Sample App无法接收FCM Data payload问题
看起来你遇到的是个典型的FCM多App同项目的配置细节问题——主App能正常触发onMessageReceived处理Data消息,但Sample App完全没反应,我整理了几个针对性的排查方向,你可以逐一验证:
1. 先移除清单中Service的多余权限配置
你的AndroidManifest.xml里给Messaging和InstanceID Service加了android:permission="android.permission.INTERNET",这是完全不必要且可能触发问题的!
FCM的系统服务需要主动唤起你的AppFirebaseMessagingService来传递消息,而android:permission属性是用来限制哪些组件可以启动这个Service的。添加INTERNET权限后,只有持有该权限的组件才能启动它,但FCM的系统服务并不需要声明这个权限,这就可能导致系统无法触发你的Service。
主App可能因为历史配置或系统适配刚好绕过了这个限制,但Sample App没有。建议立刻移除这两个Service的android:permission属性,修改后的清单代码应该是:
<service android:name=".firebase.AppFirebaseMessagingService" android:enabled="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <service android:name=".firebase.AppFirebaseInstanceIDService" android:enabled="true"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service>
2. 严格核对Sample App的包名与Firebase配置
虽然你说google-services.json配置无误,但请再仔细检查:
- Firebase控制台中Sample App的应用包名必须和
AndroidManifest.xml根节点的package属性完全一致(包括大小写,Firebase对包名匹配是严格区分的) - 如果Sample App使用了Product Flavor或Build Type导致包名后缀变化(比如
com.yourapp.samplevscom.yourapp),要确保Firebase控制台里对应的App条目包名完全匹配,并且google-services.json是下载的对应那个App的文件,不是主App的。
3. 验证BaseFirebaseMessagingService的实现逻辑
既然两个App都继承同一个基础服务,要排查Base类是否存在针对主App的特殊逻辑:
- 检查Base类的
onMessageReceived方法是否被标记为final,导致Sample App的重写不生效? - 有没有在Base类里加入了包名判断,只处理主App的消息?比如类似
if (getPackageName().equals("com.yourapp")) { ... }的逻辑? - 确认Sample App的
AppFirebaseMessagingService重写onMessageReceived时,有没有添加Logcat打印,避免因为没日志误以为方法没触发。
4. 测试前台状态下的Data消息接收
FCM的纯Data消息在App后台/被杀死时,不会触发onMessageReceived,而是会把Data数据附加到App启动的Intent中。你可以:
- 把Sample App保持在前台状态,再发送你提供的Data消息结构
- 查看Logcat中是否有
AppFirebaseMessaging标签的日志,确认onMessageReceived是否被调用
如果前台能触发,那问题出在后台消息的送达策略;如果前台也不行,那还是前面的配置问题。
5. 检查Firebase SDK版本一致性
确保主App和Sample App依赖的Firebase SDK版本完全一致,包括firebase-messaging、firebase-core等核心库。版本不一致可能导致Sample App的FCM客户端与Firebase服务器的协议不兼容,进而无法接收Data消息。
最后验证:用Firebase控制台发送纯Data消息
在Firebase控制台的Cloud Messaging模块中,创建一条新消息,选择仅发送Data消息(不要填写Notification标题/内容),然后发送给Sample App的测试设备,看是否能触发onMessageReceived。这可以排除你自己构造的消息结构是否存在隐藏问题。
如果以上步骤都排查过还是不行,可以提供Sample App的Logcat日志(过滤FirebaseMessaging标签),这样能更精准定位问题。
内容的提问来源于stack exchange,提问作者Saik Caskey

