Swift FCM向指定token推送通知后台下didReceiveRemoteNotification不触发问题
问题原因及修复方案
1. FCM content-available 参数配置位置错误
你当前把content-available直接放在FCM请求的根参数中,该参数属于APNS专属配置,在FCM请求中需要按如下规则调整:
- FCM根层级的静默推送参数名为
content_available(下划线分隔),值为true/1 - 也可以放到
apns字段的payload中,写法为"content-available": 1
修正后的请求参数示例:
let paramString: [String : Any] = ["to" : token, "content_available": true, // 根层级用下划线,布尔值 "priority":"high", "notification" : ["title" : title, "body" : body], "data" : ["user" : "test_id"], // 补充apns字段确保兼容性 "apns": [ "payload": [ "aps": [ "content-available": 1 ] ] ] ]
2. 未调用通知回调的completionHandler
你当前实现的application(_:didReceiveRemoteNotification:fetchCompletionHandler:)方法中,没有调用传入的completionHandler闭包。苹果要求该方法必须在收到通知后30秒内执行该闭包,告知系统推送处理结果,否则系统会判定你的应用处理推送失败,后续会限制甚至停止唤醒你的应用触发该方法。
修正后的方法代码:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { let data = userInfo["user"] as? String print("GET NOTIFICATION, userID: \(data)") // 必须调用闭包,根据你的处理结果传对应值:.newData/.failed/.noData completionHandler(.newData) }
3. 权限配置校验
你需要确认两项配置是否正常开启:
- Xcode 项目
Signing & Capabilities→Background Modes中已经勾选Remote notifications选项 - 测试设备的系统设置→你对应的应用→
后台App刷新权限已经开启,若用户关闭该权限,静默推送无法唤醒应用触发回调
4. 补充实现用户通知中心代理方法
如果需要监听用户点击通知栏推送的行为,还需要实现UNUserNotificationCenterDelegate的对应方法,该场景下不会走didReceiveRemoteNotification:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let userInfo = response.notification.request.content.userInfo let data = userInfo["user"] as? String print("User clicked notification, userID: \(data)") completionHandler() }
测试注意事项
调试后台推送时,建议断开Xcode连接,直接在设备上启动应用后切到后台,再发送推送测试。Xcode调试模式会改变应用的生命周期优先级,可能导致后台唤醒逻辑表现异常。
内容的提问来源于stack exchange,提问作者LiorD
相关产品推荐
相关产品推荐

