You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在应用进程被杀死(含强制关闭)时接收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. 测试验证方法

一定要用真实设备测试,模拟器的推送服务经常有问题。测试步骤:

  1. 安装APP,获取设备的FCM token。
  2. 从最近任务栏彻底划掉APP(杀死进程)。
  3. 用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
    
  4. 检查设备是否弹出通知。

内容的提问来源于stack exchange,提问作者Abdullah Ayman

火山引擎 最新活动