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

iOS11 Swift4后台接收推送时获取Payload数据及回调异常问题

解决iOS 11+Swift4环境下Firebase后台推送didReceiveRemoteNotification不触发的问题

我之前也踩过Firebase后台推送的坑,咱们直接来拆解问题、解决问题:

核心原因

从Firebase控制台发送的纯通知消息(只填标题、内容的那种),在App后台时会被iOS系统直接接管展示,不会触发App内的回调方法。要让后台能获取到Payload,你需要发送带数据字段+唤醒标记的推送。

第一步:开启App后台推送权限

先确认你的App已经配置了必要的后台权限:

  1. 打开Xcode,选中项目 → 进入Signing & Capabilities标签
  2. 点击+ Capability,搜索并添加Background Modes
  3. 勾选Remote notifications选项

第二步:正确实现回调方法

iOS 10+推荐用UNUserNotificationCenterDelegate处理通知,同时必须实现带fetchCompletionHandler的didReceiveRemoteNotification版本(不带handler的版本在后台不会触发)。给你一份完整的代码示例:

import Firebase
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
        
        // 配置通知代理与权限
        UNUserNotificationCenter.current().delegate = self
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: { _, _ in }
        )
        application.registerForRemoteNotifications()
        
        return true
    }
    
    // 前台收到通知的回调(你已经能正常使用这个)
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        let payload = notification.request.content.userInfo
        print("前台收到推送Payload: \(payload)")
        // 按需选择通知展示方式
        completionHandler([.alert, .badge, .sound])
    }
    
    // 用户点击后台通知/后台收到带数据推送时触发
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        let payload = response.notification.request.content.userInfo
        print("后台点击通知/收到数据Payload: \(payload)")
        // 在这里处理你的Payload数据
        completionHandler() // 必须调用此方法结束回调
    }
    
    // 后台静默接收推送数据(需携带content-available标记)
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print("后台静默获取到Payload: \(userInfo)")
        // 处理完数据后,根据结果调用completionHandler
        completionHandler(.newData) // 可选值:.noData/.failed
    }
}

第三步:正确发送Firebase推送

从Firebase控制台发送时,别只填基础通知内容,一定要进入Advanced options添加以下参数:

  • 添加键:content-available,值:1(注意是数字类型,不是字符串)
  • (可选)添加键:mutable-content,值:1(如果需要在后台修改通知内容)
  • 你可以在Custom data里添加自定义业务字段,这些字段会被包含在Payload中

额外注意点

  • 如果App被完全杀死(从后台划掉),只有用户点击通知才会触发回调,静默推送(仅带content-available)无法唤醒被杀死的App,这是iOS系统的限制
  • 测试后台推送时,记得把App退到后台(不要杀死),再发送带上述参数的推送,就能看到回调正常触发了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:15:23