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

iOS Swift中FCM后台推送异常问题求助

解决Swift集成FCM后台推送接收异常问题

我来帮你排查这个后台推送的问题!这种情况十有八九是服务器发送的FCM payload格式不符合iOS APNs的要求,或者你的App配置有遗漏,咱们一步步来梳理:

1. 重点检查服务器发送的Payload结构

FCM控制台和pushtry.com会自动生成符合标准的payload,但自定义服务器API很容易踩格式坑。iOS后台推送必须满足两个核心要求:

  • 必须包含aps字典,且里面要有alert(用于显示横幅)、sound(触发声音)字段,否则后台收到推送也不会有视觉/听觉提示
  • 要开启content-available: 1,让App在后台能被唤醒处理推送

给你一个标准的后台推送payload示例:

{
  "to": "你的设备Token",
  "content_available": true,
  "apns": {
    "payload": {
      "aps": {
        "alert": {
          "title": "新消息提醒",
          "body": "这是一条后台推送内容"
        },
        "sound": "default",
        "badge": 1,
        "content-available": 1
      },
      // 自定义data字段放在aps外面
      "custom_data": "你的业务数据"
    }
  }
}

⚠️ 注意:如果服务器只发了data字段没有aps.alert,App后台状态下不会显示横幅和声音,甚至可能无法触发回调。

2. 确认App的后台推送权限配置

  • 权限请求: 确保你在启动时请求了完整的推送权限,代码示例:
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
    guard granted else { return }
    DispatchQueue.main.async {
        UIApplication.shared.registerForRemoteNotifications()
    }
}
  • 后台模式开启: 打开Info.plist,添加UIBackgroundModes数组,里面必须包含remote-notification项(对应Xcode后台模式里的“远程通知”选项)。没有这个配置,App后台根本收不到推送。

3. 检查FCM初始化和代理设置

  • 在AppDelegate的didFinishLaunchingWithOptions里必须完成Firebase初始化和通知代理绑定:
FirebaseApp.configure()
UNUserNotificationCenter.current().delegate = self
Messaging.messaging().delegate = self
  • 如果你的App用了SceneDelegate,别忘了在scene(_:willConnectTo:options:)里也设置通知代理,避免场景切换导致代理失效。

4. 正确实现后台推送回调

后台推送的回调处理很关键,必须调用fetchCompletionHandler告诉系统你已经处理完推送,否则后续推送可能会被限制:

// AppDelegate中
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    // 在这里处理你的推送业务逻辑
    print("后台收到推送:\(userInfo)")
    completionHandler(.newData) // 一定要调用这个方法
}

// 如果用了SceneDelegate,还要实现这个方法
func scene(_ scene: UIScene, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    completionHandler(.newData)
}

5. 测试时注意App状态

  • 测试后台推送时,要确保App是退到后台(按Home键),而不是被彻底杀死(划掉App)。如果App被杀死,只有包含aps.alert的推送才能在通知中心显示,纯data消息是收不到的。
  • 可以用Xcode的控制台查看推送日志,搜索remote notification关键词,确认推送是否到达设备。

先把服务器的payload改成和FCM控制台一致的格式,再检查上述配置,应该就能解决后台推送的问题了!

内容的提问来源于stack exchange,提问作者B.Saravana Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:17:52