如何在应用进程被杀死(含强制关闭)时接收FCM推送通知?
嘿,这个问题问到点子上了——毕竟像WhatsApp这类即时通讯APP的核心体验,就是不管用户有没有打开APP、甚至进程被彻底杀掉,都能第一时间收到消息。我来给你拆解实现的关键步骤,都是实战里验证过的:
核心原理:依赖系统级推送通道
首先要明白:当你的APP进程被杀死时,自己写的所有代码都没法运行了,所以必须依靠系统托管的推送服务来处理消息。FCM在Android上是和系统的Google Play Services绑定的,iOS则是通过APNs(苹果推送服务)转发消息——这俩都是系统级的服务,就算你的APP没运行,它们也会一直在后台待命,收到消息后直接触发系统通知。
1. 选对FCM消息类型
FCM有两种主要消息类型,对应不同的场景:
- 通知消息:这是最省心的选项。当APP在后台/进程被杀时,系统会直接接管消息,自动弹出通知,不需要你写任何额外的处理代码。你只需要在发送消息的payload里包含
notification字段就行,比如:{ "to": "DEVICE_TOKEN", "notification": { "title": "新消息", "body": "有人给你发消息啦" } } - 数据消息:如果需要自定义通知样式、或者做静默处理(比如更新本地数据),就用这种类型。但要注意:进程被杀时,数据消息只有设置了高优先级,才会触发你在
FirebaseMessagingService里重写的onMessageReceived方法。
2. 配置必要的权限与服务
Android端
- 首先在
AndroidManifest.xml里注册FCM的消息服务:<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> - 新增必要权限:Android 13+需要
POST_NOTIFICATIONS权限,还要确保有INTERNET权限(FCM需要联网):<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> - 必须创建Notification Channel:Android 8.0(API 26)及以上,没有通知通道的话,系统不会展示任何通知。可以在Application类的
onCreate里创建:override fun onCreate() { super.onCreate() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( "chat_channel", "聊天消息", NotificationManager.IMPORTANCE_HIGH ).apply { description = "接收好友的聊天消息通知" } val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) } }
iOS端
- 在
Info.plist里开启后台推送权限:添加UIBackgroundModes字段,包含remote-notification值。 - 确保正确配置APNs证书,因为FCM在iOS上是通过APNs转发消息的,证书出错的话推送根本到不了设备。
3. 设置消息高优先级
不管是通知消息还是数据消息,都要设置高优先级,这样系统会立刻处理推送,不会因为后台资源紧张而延迟。在发送消息的payload里加上:
- Android:
"priority": "high" - iOS:在
apns字段里设置apns-priority为10:{ "to": "DEVICE_TOKEN", "notification": { "title": "新消息", "body": "有人给你发消息啦" }, "apns": { "headers": { "apns-priority": "10" } }, "priority": "high" }
4. Android端:应对厂商ROM的后台限制
这是很多开发者踩坑的地方!国内小米、华为、OPPO、vivo等厂商的ROM都有自己的后台管理机制,会强制杀死后台APP,甚至会停止FCM相关的服务。解决办法是:
- 在APP首次启动时,引导用户把APP加入后台白名单,或者开启“自启动权限”“后台运行权限”。你可以通过Intent跳转到对应厂商的设置页面(不同厂商的设置页面包名不同,需要单独适配)。
- 不要用任何“保活手段”(比如前台Service、双进程守护),Android现在对这类行为限制非常严,不仅没用,还可能被系统判定为恶意APP,直接封禁。
5. 测试验证方法
一定要用真实设备测试,模拟器的推送服务经常有问题。测试步骤:
- 安装APP,获取设备的FCM token。
- 从最近任务栏彻底划掉APP(杀死进程)。
- 用Firebase控制台或者curl命令发送测试消息:
curl -X POST -H "Authorization: key=YOUR_SERVER_KEY" -H "Content-Type: application/json" -d '{ "to": "YOUR_DEVICE_TOKEN", "notification": { "title": "测试通知", "body": "进程被杀后收到的消息" }, "priority": "high" }' https://fcm.googleapis.com/fcm/send - 检查设备是否弹出通知。
内容的提问来源于stack exchange,提问作者Abdullah Ayman




