iOS Swift中如何隐藏Firebase前台/后台推送并仅处理推送数据?
解决iOS Firebase静默推送(仅处理数据不展示通知)的问题
我来帮你搞定这个问题!你遇到的核心问题是对iOS推送的两种类型(通知推送 vs 静默推送)以及Firebase的Payload结构理解有误,下面一步步给你解决:
问题根源分析
- 你之前尝试去掉
notification.title和body时,Payload不符合iOS静默推送的要求,导致APNs(苹果推送服务)不会把推送给到你的App,所以AppDelegate里没有任何回调触发。 - 当你加上
title和body后,这变成了通知推送(Notification Message),系统会自动展示通知弹窗,App前台时就会触发willPresent方法,这显然不是你想要的“仅处理数据”的效果。
正确解决方案
1. 调整服务器发送的Payload结构
你需要发送Data Message(而非Notification Message),这种类型的推送会直接把数据传递给App,不会触发系统通知弹窗。关键是要在Payload中包含aps.content-available: 1(这是iOS识别静默推送的标识),同时把自定义数据放在data字段里。
正确的Payload示例:
{ "to": "iosTokenList[i]", "data": { "Id": "你的ID值", "someList": ["item1", "item2"], "status": "inactive", "notificationType": "status", "aps": { "content-available": 1 } } }
注意:不要包含
notification字段,否则会变成通知推送,系统会自动展示弹窗。
2. 开启App的后台推送权限
在Xcode中打开你的项目设置:
- 进入
Signing & Capabilities标签页 - 点击
+ Capability,添加Background Modes - 勾选
Remote notifications选项
这个权限是App在后台接收静默推送的必要条件,否则即使Payload正确,后台也无法触发回调。
3. 完善AppDelegate的回调方法
你之前的代码缺少了处理静默推送的关键回调,需要补充以下方法:
处理静默推送的核心回调
// 带fetchCompletionHandler的推送回调(静默推送会触发这个方法) func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { print("收到静默推送数据: \(userInfo)") // 解析并处理你的自定义数据 NotificationParser.parseIncommingMessages(userInfo: userInfo) // 告诉系统处理完成,根据实际情况选择结果 completionHandler(.resultNewData) }
(可选)处理用户点击通知的场景
如果你之后需要处理用户主动点击通知的情况,还可以补充iOS 10+的专属方法:
@available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let userInfo = response.notification.request.content.userInfo NotificationParser.parseIncommingMessages(userInfo: userInfo) completionHandler() }
4. 适配NotificationParser的解析逻辑
确保你的NotificationParser.parseIncommingMessages方法可以直接解析userInfo字典里的自定义字段,而不是依赖UNNotification对象(因为静默推送不会生成UNNotification实例)。
验证效果
按以上步骤调整后:
- App前台/后台/杀死状态下,都能接收并处理推送数据,不会展示通知弹窗
didReceiveRemoteNotification(_:fetchCompletionHandler:)方法会被触发,你可以在这里处理自定义数据
内容的提问来源于stack exchange,提问作者Dhiru
相关产品推荐
相关产品推荐

