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

FCM通知延迟问题求助:Flutter应用关闭时无法实现即时呼叫功能

解决Flutter FCM应用关闭后通知延迟问题

针对你遇到的应用完全关闭时FCM通知延迟、影响呼叫功能的问题,可从以下几个方向排查优化:

1. 强制设置消息高优先级

呼叫类场景必须使用高优先级消息,确保系统优先投递:

  • 发送FCM请求时,明确设置:
    • Android端:priority: "high"
    • iOS端:apns-priority: 10(对应FCM的priority: "high")
  • 示例FCM请求体(data消息,更适合呼叫场景):
{
  "to": "目标设备Token",
  "priority": "high",
  "data": {
    "type": "incoming_call",
    "caller_id": "1001",
    "caller_name": "来电用户",
    "call_token": "abcdefg"
  }
}

2. 平台针对性配置

Android端

  • 通知渠道配置:Android 8.0+需创建IMPORTANCE_HIGH级别的通知渠道,代码示例:
await flutterLocalNotificationsPlugin.createNotificationChannel(
  AndroidNotificationChannel(
    'call_channel',
    '来电通知',
    description: '接收来电提醒',
    importance: Importance.high,
    enableVibration: true,
    playSound: true,
  ),
);
  • 后台消息处理:确保firebase_messaging的onBackgroundMessage是顶级全局函数,用于接收data消息并触发本地通知:
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  // 解析data,创建高优先级本地通知
  await flutterLocalNotificationsPlugin.show(
    int.parse(message.data['call_id']),
    message.data['caller_name'],
    '正在呼叫您',
    NotificationDetails(
      android: AndroidNotificationDetails(
        'call_channel',
        '来电通知',
        importance: Importance.high,
        priority: Priority.high,
        fullScreenIntent: true, // 触发全屏呼叫界面
      ),
    ),
  );
}
  • 关闭电池优化:引导用户将应用从系统电池优化中排除,部分厂商(小米、华为、OPPO)的电池优化会杀死后台进程导致推送延迟,可通过代码跳转至设置页面:
// 检测并跳转电池优化设置
final packageName = await PackageInfo.fromPlatform().then((info) => info.packageName);
await AndroidIntent(
  action: 'android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS',
  data: 'package:$packageName',
).launch();
  • 厂商白名单配置:引导用户将应用添加到系统后台白名单、允许自启动,不同厂商路径不同,可在应用内给出指引。

iOS端

  • 开启后台推送模式:在Xcode的Capabilities中打开Background Modes,勾选Remote notifications。
  • 设置通知中断级别:iOS 15+需将通知的interruptionLevel设为.critical,确保专注模式下也能弹出:
await flutterLocalNotificationsPlugin.show(
  callId,
  callerName,
  '正在呼叫您',
  NotificationDetails(
    iOS: IOSNotificationDetails(
      interruptionLevel: IOSInterruptionLevel.critical,
      sound: 'call_sound.wav',
    ),
  ),
);
  • 确认推送证书有效性:使用生产环境推送证书发布应用,测试环境推送可能存在延迟;确保证书未过期、Bundle ID匹配。

3. 选择合适的消息类型

优先使用data消息而非notification消息:

  • notification消息由系统接管展示,应用关闭时无法自定义处理逻辑;
  • data消息可通过onBackgroundMessage接收后,自行构建全屏呼叫通知或跳转至呼叫页面,完全可控。

4. 依赖版本与测试

  • 确保firebase_messaging、flutter_local_notifications等依赖使用最新稳定版,避免旧版本的兼容性问题;
  • 直接通过FCM API(而非控制台)测试推送,排除控制台的延迟因素;
  • 在多厂商Android设备上测试,不同ROM的后台限制逻辑差异较大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:52:39