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
相关产品推荐
相关产品推荐

