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

Flutter Firebase Messaging iOS端无法接收后端推送(Android正常)

Flutter FCM iOS端无法接收后端主题推送问题解决

核心问题

你后端发送的是纯data类型消息,iOS对这类消息的处理逻辑和Android存在差异:

  • Android无论APP处于前台/后台/杀死状态,纯data消息都能触发对应回调或通知
  • iOS仅在APP前台运行时,纯data消息会通过FirebaseMessaging.onMessage回调;后台或APP被杀死时,APNs不会主动展示通知,也不会触发回调,除非消息包含notification字段,或者配置了后台唤醒参数。

解决方案

1. 调整后端Payload结构

给消息添加notification字段(iOS要求标题和内容必填),同时可配置iOS专属参数用于后台处理。修改后的后端代码:

const sendDataNotif = async (token: string, data: object, topic: string) => {
  try {
    const headers = {
      Authorization: 'Bearer ' + token,
    };
    const payload = {
      message: {
        topic,
        data,
        // 新增notification字段,确保iOS后台能收到通知
        notification: {
          title: "你的通知标题",
          body: "你的通知内容"
        },
        // 可选:配置iOS后台唤醒,用于处理data消息
        apns: {
          payload: {
            aps: {
              content_available: true
            }
          }
        }
      },
    };

    return await axios({
      method: 'post',
      url: `https://fcm.googleapis.com/v1/projects/${key.project_id}/messages:send`,
      data: payload,
      headers,
    });
  } catch (error: any) {
    console.log(error.message);
  }
};

2. 确认主题订阅有效性

虽然订阅无报错,但可以在iOS端主动校验已订阅主题:

// 在登录后调用,检查是否真的订阅成功
Future<void> checkSubscribedTopics() async {
  List<String>? topics = await FirebaseMessaging.instance.getTopics();
  print('已订阅主题列表: $topics');
}

3. 升级依赖版本

你使用的firebase_messaging 15.2.5和firebase_core 3.13.0是较旧版本,可能存在iOS适配漏洞,建议升级到最新稳定版,同时保持两个依赖版本兼容。

4. 后台消息处理补充(可选)

如果需要纯data消息在iOS后台触发业务逻辑,还需要:

  • 确保Xcode中已开启Background Modes里的Remote notifications
  • 消息Payload中添加content_available: true
  • 在Flutter中实现顶级静态的onBackgroundMessage回调函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:31:03