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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:24:00