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

FCM通知中willPresentNotification方法未被调用问题求助

解决FCM服务器通知不触发willPresentNotification的问题

我之前也碰到过一模一样的问题——Firebase控制台发通知能正常触发前台展示回调,但服务器发的就没反应,核心问题基本都出在FCM消息的payload格式上。结合你的代码,给你梳理下具体解决步骤:

1. 先搞懂两种FCM消息类型的区别

FCM有两种核心消息类型,它们在APP前台的处理逻辑完全不同:

  • 通知消息(Notification Message):由FCM自动转发给APNS,系统会自动处理通知展示,APP在前台时会触发willPresentNotification。Firebase控制台发送的就是这种类型。
  • 数据消息(Data Message):完全由APP自行处理,系统不会自动展示通知,前台时只会触发didReceiveRemoteNotification,不会走willPresentNotification。

你的服务器大概率是发送了纯数据消息,或者payload格式不符合通知消息的要求。

2. 调整服务器的FCM Payload结构

要让服务器发送的通知在前台触发willPresentNotification,必须保证payload包含notification字段(或者针对iOS的APNS专属配置)。下面是一个标准的有效payload示例:

{
  "to": "你的FCM设备令牌",
  "notification": {
    "title": "服务器通知标题",
    "body": "服务器通知内容",
    "sound": "default"
  },
  "data": {
    // 自定义业务数据,可选
    "order_id": "12345"
  },
  "apns": {
    "payload": {
      "aps": {
        "alert": {
          "title": "服务器通知标题",
          "body": "服务器通知内容"
        },
        "sound": "default",
        "badge": 1
      }
    },
    "headers": {
      "apns-priority": "5" // 前台通知用优先级5,后台推送用10
    }
  }
}

重点注意:

  • 必须包含notification节点,或者在apns.payload.aps里配置alert字段(二选一即可,推荐前者,FCM会自动适配多平台)。
  • 如果只发送data字段,系统不会触发willPresentNotification,需要你在didReceiveRemoteNotification里手动创建并展示通知。

3. 确保willPresentNotification实现完整

虽然你说控制台发送时这个方法会被调用,但还是确认下实现是否正确,特别是要调用completionHandler并传入展示选项:

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    // 打印通知内容方便调试
    NSDictionary *userInfo = notification.request.content.userInfo;
    if (userInfo[kGCMMessageIDKey]) {
        NSLog(@"服务器通知ID: %@", userInfo[kGCMMessageIDKey]);
    }
    NSLog(@"服务器通知内容: %@", userInfo);
    
    // 告诉系统要展示通知的哪些部分(弹窗、声音、角标)
    completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionBadge);
}

4. 额外检查点

  • 确认你的APNS证书已经正确上传到Firebase控制台,并且和APP的bundle ID完全匹配。
  • 确认用户已经授权了通知权限(你的代码里已经做了请求授权,这部分没问题)。
  • 如果服务器用的是FCM的HTTP v1 API,确保请求的权限和配置正确,没有遗漏必要的字段。

按照上面的步骤调整后,服务器发送的通知应该就能在APP前台触发willPresentNotification并正常展示了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:53:49