You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中Firebase后台推送通知锁屏不触发问题求助

问题分析与解决方案

一、Flutter + Firebase 锁屏触发告警的问题

这不是Flutter本身的限制,核心问题出在推送通知的类型配置和后台权限获取上:

1. 区分通知消息和数据消息

Firebase推送分两种核心类型:

  • 通知消息:由FCM直接接管展示,锁屏时系统仅显示通知卡片,你的后台监听器(如onMessageOpenedApp)只有用户解锁并点击通知后才会触发。
  • 数据消息:完全由APP自主处理,无论锁屏与否,只要APP处于后台(甚至被杀死,配置到位的情况下),都会触发onBackgroundMessage回调。

你需要确保后端发送的是纯数据消息,或包含data字段的混合消息(即使带notification字段,后台回调仍能触发)。示例数据消息结构:

{
  "to": "DEVICE_TOKEN",
  "data": {
    "title": "紧急告警",
    "body": "系统异常,请立即处理",
    "alert_level": "critical"
  }
}

2. 配置后台权限与唤醒逻辑

  • Android端:

    • 在AndroidManifest.xml中添加唤醒锁权限:
      <uses-permission android:name="android.permission.WAKE_LOCK" />
      
    • 针对Android 12+,必须申请POST_NOTIFICATIONS权限,且在后台回调中创建高优先级通知,直接唤醒屏幕:
      Future<void> showCriticalAlert(Map<String, dynamic> message) async {
        const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
          "alert_channel",
          "告警专用通道",
          importance: Importance.max,
          priority: Priority.high,
          wakeLockTimeout: 15000, // 唤醒屏幕15秒
          enableVibration: true,
          vibrationPattern: [0, 600, 600, 600],
        );
        const NotificationDetails notificationDetails = NotificationDetails(android: androidDetails);
        await FlutterLocalNotificationsPlugin().show(
          DateTime.now().millisecondsSinceEpoch,
          message["title"],
          message["body"],
          notificationDetails,
        );
      }
      
    • 引导用户将APP加入电池优化白名单,避免系统因省电策略杀死后台进程。
  • iOS端:

    • 在Xcode项目配置中开启Background Modes下的Remote notifications选项。
    • 推送消息必须携带content-available: 1,确保APP在锁屏/后台时能被唤醒处理逻辑。
    • 对于iOS 15+,设置interruption-level: critical,让通知突破专注模式和锁屏限制,强制提醒用户。

二、OpsGenie的实现逻辑

OpsGenie能在锁屏下直接触发告警,核心是做了这些优化:

  • 优先使用数据消息触发后台逻辑,绕过FCM的通知展示限制,确保锁屏时APP能自主执行告警代码。
  • 最大化系统权限:
    • Android端申请WAKE_LOCK和ACCESS_NOTIFICATION_POLICY权限,允许直接唤醒屏幕、绕过免打扰模式。
    • iOS端使用critical级别的通知,配合content-available唤醒后台进程,同时引导用户授予完整的通知权限(包括锁屏显示、声音、震动)。
  • 后台进程保活:
    • Android端采用前台服务(Foreground Service),避免被系统回收,确保推送回调始终能触发。
    • iOS端利用APNs静默推送机制,唤醒APP执行告警逻辑后快速退出,符合苹果的后台运行规范。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:20:13