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

FCM后台通知无法正常工作的技术问题求助

解决iOS FCM后台通知无法触发didReceiveRemoteNotification的问题

我看你已经完成了基础配置(开启Push Notifications和Background Modes里的Remote notifications,APNs令牌正常,常规推送能正常工作),但后台通知始终无法触发目标方法,结合你遇到的问题,我整理了几个关键的排查和修复点:

1. 修正FCM Payload格式(核心问题)

后台静默通知的Payload必须严格符合Apple和FCM的规范,你之前的示例里存在语法错误和字段层级问题,这是最常见的诱因:

正确的后台通知Payload示例

{
  "data": {
    "name": "name",
    "title": "title",
    "body": "body"
  },
  "content_available": true,
  "apns": {
    "headers": {
      "apns-priority": "5",
      "apns-push-type": "background"
    },
    "payload": {
      "aps": {
        "content-available": 1
      }
    }
  },
  "topic": "你的App Bundle ID"
}

关键注意事项:

  • 不要包含notification字段:如果Payload里存在notification字段,iOS会将其识别为普通推送通知,即使在后台也会弹出通知提示,不会走didReceiveRemoteNotification方法。
  • 双端content-available标记都要加:FCM层的content_available: true用于告知FCM转发时启用后台模式,APNs层的aps.content-available: 1是Apple要求的后台触发标记,二者缺一不可。
  • 严格保证JSON语法正确:你之前的示例存在引号不匹配(比如'title")、多余逗号(比如"body": "body",末尾的逗号)等问题,这些都会导致推送失败,进而触发你遇到的错误码16。
  • apns-push-type必须设为background:iOS 13及以上版本强制要求该字段,否则后台通知会被系统直接拦截。
  • 优先级固定为5:后台通知不能使用高优先级(10),否则会被系统判定为干扰性推送而拒绝。

2. 确认代码实现细节

虽然你提到常规推送正常,但还是要检查以下代码细节:

  • 确保didReceiveRemoteNotification方法在AppDelegate(或SceneDelegate,若使用Scene架构)中正确实现,并且必须调用completionHandler:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    // 这里写你的后台通知处理逻辑
    print("收到后台通知:\(userInfo)")
    // 必须调用completionHandler,否则系统会判定App处理超时
    completionHandler(.newData)
}
  • 若使用SceneDelegate,还需要实现对应场景的回调方法:
func scene(_ scene: UIScene, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    completionHandler(.newData)
}

3. 排查错误码16的问题

你遇到的Process exited with code 16错误,本质是FCM请求的Payload不符合要求,常见原因包括:

  • JSON语法错误(引号、逗号、括号不匹配)
  • topic字段格式错误:必须是你的App Bundle ID,或是FCM控制台中配置的合法主题名称
  • 字段拼写错误:比如把FCM的content_available写成APNs的content-available(FCM用下划线,APNs用中划线)

4. 额外测试注意事项

  • 不要用Xcode调试状态测试:Xcode连接设备时,App的后台行为会被调试环境干扰,建议断开设备与Xcode的连接,杀掉App后再发送后台通知测试。
  • 确认设备状态:后台通知需要设备处于联网状态,且未开启低电量模式(低电量模式会禁用后台刷新功能)。
  • 直接测试APNs推送:可以跳过FCM,用Apple官方的APNs测试工具直接发送后台通知,排查是否是FCM转发环节的问题。

按照这些步骤调整后,应该就能正常触发后台通知的回调方法了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:36:54