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
相关产品推荐
相关产品推荐

