FCM推送通知至iOS真机无接收问题技术求助
嘿,我之前也碰到过类似的FCM推送问题,折腾了好一阵才搞定,给你列几个最容易踩坑的排查点,你一个个核对下:
确认通知权限是否正确获取
你得确保App已经向用户申请了通知权限,并且用户允许了。在didFinishLaunchingWithOptions里,除了FCM的配置,还要加权限申请代码:UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in guard granted else { return } DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } }而且要检查
Info.plist里有没有加NSUserNotificationUsageDescription(iOS 10+),不然权限申请弹窗根本不会出现,用户没法授权。检查APNs证书/密钥是否配置正确
FCM是依赖APNs推送的,所以你得确保在Firebase控制台的「项目设置>云消息传递」里,已经上传了正确的APNs证书(开发和生产环境要分开),或者配置了APNs密钥。如果用Xcode自动管理签名,也要确认你的开发者账号里已经开启了Push Notifications服务。后台模式是否开启
在Xcode的项目配置「Signing & Capabilities」里,要开启「Background Modes」,并勾选「Remote notifications」。这一步超容易忘,没开的话App后台或者锁屏时基本收不到推送。检查推送消息的格式
如果你用Firebase控制台发测试消息,要注意:- 发送的是通知消息(Notification message),而不是仅数据消息(Data message)——数据消息需要你自己在代码里处理展示,控制台发的话要确保勾选了「通知」标签。
- 如果用API发送,要确保payload里包含
notification字段,并且content_available设为true(需要后台唤醒的话)。比如:{ "to": "你的FCM令牌", "notification": { "title": "测试标题", "body": "测试内容" }, "content_available": true }
验证App Delegate的FCM代码是否完整
你提到已经实现了部分代码,还要确认这几个关键方法有没有写:// 注册APNs成功获取deviceToken后,传给FCM func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken } // 处理前台收到的通知(要显示的话必须实现) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { // 前台时也要弹出通知的话,返回对应的选项 completionHandler([.alert, .badge, .sound]) }另外,iOS 13+还要记得设置
UNUserNotificationCenter的代理:UNUserNotificationCenter.current().delegate = self区分测试/生产环境
如果你的App是用开发证书打包的,FCM要发送到开发环境;如果是Ad Hoc或App Store版本,要切换到生产环境。Firebase控制台发送时可以选择「测试设备」,API发送则要设置apns-environment为development或production。检查设备本身的通知设置
最后别忘了看iPhone的系统设置:确保你的App通知是开启的,没有被静音、屏蔽,或者在「专注模式」里被排除了。
按这个顺序排查下来,大概率能找到问题所在~
内容的提问来源于stack exchange,提问作者madmanprogram

