如何在后台接收FCM通知时显示弹窗并播放声音
禁用FCM Swizzling后后台推送无弹窗/声音的修复方案
我之前踩过完全一样的坑!当你把FirebaseAppDelegateProxyEnabled设为NO禁用swizzling后,FCM不会再自动帮你把data字段的内容映射到iOS系统的推送aps结构里,系统也就不会自动弹出通知和播放声音了。下面是亲测有效的修复步骤:
推送Payload必须同时包含
data和aps字段
iOS系统只认aps字段来展示推送弹窗、声音和角标,所以你的推送请求必须同时携带业务自定义的data和系统需要的aps配置。比如正确的Payload格式应该是:{ "data": { "custom_id": "123", "custom_content": "你的自定义内容" }, "aps": { "alert": { "title": "新消息提醒", "body": "这是一条后台推送" }, "sound": "default", "badge": 1 } }如果你只传
data字段,系统只会触发回调但不会展示通知,这点一定要注意!手动接管UNUserNotificationCenter代理逻辑
禁用swizzling后,FCM不再自动处理UNUserNotificationCenter的代理,你需要自己实现相关方法:- 在
AppDelegate或者SceneDelegate的初始化方法里设置代理:UNUserNotificationCenter.current().delegate = self - 实现前台推送处理方法(确保前台也能正常展示,不过你说前台已经正常,这步可以验证):
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { // 这里可以自定义前台展示逻辑,比如展示弹窗、播放声音 completionHandler([.alert, .sound, .badge]) } - 实现后台推送点击处理方法:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // 处理用户点击推送后的逻辑,比如跳转到对应页面 completionHandler() }
- 在
确认项目推送权限与注册流程
虽然你已经能收到回调,但还是要检查以下配置:- 项目
Capabilities中已经开启Push Notifications - 启动时正确向APNs请求推送权限并注册远程通知:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 初始化Firebase FirebaseApp.configure() // 请求推送权限 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in if granted { DispatchQueue.main.async { application.registerForRemoteNotifications() } } } // 设置FCM Messaging代理 Messaging.messaging().delegate = self return true }
- 项目
验证FCM Token获取流程
确保你实现了Messaging代理的token获取方法,保证推送能正确下发到设备:func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { guard let token = fcmToken else { return } // 将token上传到你的服务器,用于推送下发 print("FCM Token: \(token)") }
按照上面的步骤检查和修改后,后台推送应该就能正常弹出弹窗和播放声音了!
内容的提问来源于stack exchange,提问作者cicaletto79
相关产品推荐
相关产品推荐

