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

Flutter FCM推送Android正常iOS端自定义Payload无法接收问题

问题根因分析

你当前的问题核心出在APNs推送配置和Payload参数冲突,Firebase控制台发的通知会自动补全正确的APNs参数,但自定义Payload的时候你写错了几个关键配置:

解决步骤

1. 修正云函数的Payload配置

你当前配置为静默后台推送,却同时携带了需要弹窗展示的通知内容,导致APNs直接丢弃了推送:

  • 把apns.headers中的apns-push-type从background改为alert,带弹窗的通知必须用alert类型
  • 把apns-priority从5改为10,非静默推送优先级必须设为10才能正常触发弹窗
  • 修正apns-topic的值,当前你填的io.flutter.plugins.firebase.messaging是错误值,要替换为你Xcode中配置的应用专属Bundle ID
  • 如果不需要静默后台更新能力,可直接删除aps中的contentAvailable: true配置,避免冲突

修正后的apns字段示例:

apns: {
    payload: {
        aps: {
            sound: 'default', // 可选,推送带默认提示音
            badge: 1 // 可选,推送带角标计数
        },
    },
    headers: {
        "apns-push-type": "alert",
        "apns-priority": "10",
        "apns-topic": "你的应用实际Bundle ID",
    },
},

2. 检查Xcode项目配置

  • 打开项目的Signing & Capabilities标签,确认已添加Push Notifications能力
  • 确认已添加Background Modes能力,且勾选了Remote notifications选项
  • 确认Firebase控制台的项目设置 > 云消息传递 > Apple 应用配置中,已上传正确的APNs认证密钥(.p8文件)或者开发/生产环境的推送证书

3. 补全AppDelegate的通知配置

你当前的AppDelegate缺少前台通知展示的代理配置,添加如下代码:
首先在didFinishLaunchingWithOptions中添加权限请求和代理设置:

override func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
  GeneratedPluginRegistrant.register(with: self)
  // 新增以下代码
  UNUserNotificationCenter.current().delegate = self
  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: { _, _ }
  )
  application.registerForRemoteNotifications()
  return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}

再添加前台展示通知的代理方法:

override func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
  completionHandler([.alert, .badge, .sound])
}

4. 验证Token有效性

打印你云函数中获取的deviceToken.data()['tokens']值,直接在Firebase控制台给该Token单独发送测试推送:

  • 如果能收到,说明是Payload配置问题,按第一步修正即可
  • 如果收不到,说明客户端Token获取异常,检查Flutter端是否正确调用了FirebaseMessaging.instance.getToken()获取iOS设备的FCM Token

内容的提问来源于stack exchange,提问作者Gbenga B Ayannuga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:48:02