iOS设备接收FCM推送通知但不显示的问题求助
FCM推送通知配置后的验证与代码优化指南
嘿,看你已经搞定了FCM推送的基础配置流程,这步子迈得很稳!结合你给出的AppDelegate代码框架,我整理了几个关键的验证点和代码完善建议,帮你把推送功能彻底跑通:
1. 补全AppDelegate核心回调实现
你已经正确继承了UNUserNotificationCenterDelegate和MessagingDelegate,接下来需要补全关键的初始化和回调代码,这是FCM推送生效的核心:
完整的启动配置与Token获取代码
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 配置用户通知中心 UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { granted, error in guard granted else { print("用户未授予推送权限") return } DispatchQueue.main.async { application.registerForRemoteNotifications() } } // 初始化FCM并设置代理 Messaging.messaging().delegate = self FirebaseApp.configure() return true } // 成功注册APNS后获取设备Token,同步给FCM func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken // 转换为字符串方便查看或上传到服务器 let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() print("APNS设备Token: \(tokenString)") } // 获取FCM注册Token,用于定向推送 func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { guard let token = fcmToken else { print("FCM Token获取失败") return } print("FCM注册Token: \(token)") // 建议将此Token上传到你的后端服务,用于给特定用户发推送 } }
2. 处理不同状态下的通知回调
要确保App在前台、后台甚至被杀死状态下都能正确接收和响应通知,需要补全以下代理方法:
前台通知展示与点击处理
// iOS 10+ 前台收到通知时的回调(控制是否弹出通知) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { // 允许前台弹出通知的样式,按需调整 completionHandler([.alert, .badge, .sound]) // 解析通知内容做自定义处理 let userInfo = notification.request.content.userInfo print("前台收到通知内容: \(userInfo)") } // 点击通知后的回调(无论App处于什么状态) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let userInfo = response.notification.request.content.userInfo print("用户点击了通知: \(userInfo)") // 这里可以添加跳转页面、打开指定功能等自定义逻辑 completionHandler() }
3. 关键配置的二次验证
虽然你已经完成了基础配置,但还是建议再核对以下细节,避免踩坑:
- 确认
Info.plist中添加了FirebaseAppDelegateProxyEnabled并设置为YES(如果是通过Firebase自动配置文件导入的话,这一步会自动完成) - 检查后台模式:除了开启“远程通知”,如果需要接收静默推送,还要开启“后台获取”
- 验证.p12证书:确保证书在有效期内,上传到Firebase控制台时输入的密码完全匹配,且开发/生产环境的证书不要搞混
- 测试设备的iOS版本建议在10以上,适配最新的UserNotifications框架
4. 测试推送的实用技巧
- 使用Firebase控制台的「Cloud Messaging」功能,输入你打印的FCM Token发送测试通知,快速验证推送链路
- 如果测试失败,优先查看Xcode控制台的日志,搜索
FCM、APNS关键词,常见问题包括Token获取失败、证书不匹配、权限未授予等 - 注意:开发环境要用开发证书,生产环境要用生产证书,两者不能交叉使用
内容的提问来源于stack exchange,提问作者K. Mitra
相关产品推荐
相关产品推荐

