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

如何在后台接收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的代理,你需要自己实现相关方法:

    1. 在AppDelegate或者SceneDelegate的初始化方法里设置代理:
      UNUserNotificationCenter.current().delegate = self
      
    2. 实现前台推送处理方法(确保前台也能正常展示,不过你说前台已经正常,这步可以验证):
      func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
          // 这里可以自定义前台展示逻辑,比如展示弹窗、播放声音
          completionHandler([.alert, .sound, .badge])
      }
      
    3. 实现后台推送点击处理方法:
      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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:26:06