iOS11 Swift4后台接收推送时获取Payload数据及回调异常问题
解决iOS 11+Swift4环境下Firebase后台推送didReceiveRemoteNotification不触发的问题
我之前也踩过Firebase后台推送的坑,咱们直接来拆解问题、解决问题:
核心原因
从Firebase控制台发送的纯通知消息(只填标题、内容的那种),在App后台时会被iOS系统直接接管展示,不会触发App内的回调方法。要让后台能获取到Payload,你需要发送带数据字段+唤醒标记的推送。
第一步:开启App后台推送权限
先确认你的App已经配置了必要的后台权限:
- 打开Xcode,选中项目 → 进入
Signing & Capabilities标签 - 点击
+ Capability,搜索并添加Background Modes - 勾选
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
相关产品推荐
相关产品推荐

