iOS Swift项目接入Firebase后无法接收FCM推送通知问题求助
问题根因及修复方案
1. 核心错误:APNs注册回调方法签名不匹配
你当前实现的didRegisterForRemoteNotificationsWithDeviceToken方法缺少外部参数标记_,且参数类型使用了已废弃的NSData,导致系统根本不会触发该回调,FCM无法获取APNs设备令牌,直接触发你看到的报错日志。
2. 逻辑错误:FCM令牌获取时机过早
你在didFinishLaunchingWithOptions中刚初始化Firebase就立即请求FCM令牌,此时APNs注册流程尚未完成,APNs令牌还未返回给应用,必然会提示APNs设备令牌未设置。
3. 逻辑错误:远程通知注册顺序错误
你在通知权限请求的异步回调外直接调用registerForRemoteNotifications,还重复调用了两次,应该等用户同意通知权限后再执行远程通知注册逻辑。
修复后的代码示例
didFinishLaunchingWithOptions部分
FirebaseApp.configure() Messaging.messaging().delegate = self if #available(iOS 10, *) { UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]){ (granted, error) in guard granted else { return } DispatchQueue.main.async { application.registerForRemoteNotifications() } } } else { let settings = UIUserNotificationSettings(types: [.badge, .alert, .sound], categories: nil) application.registerUserNotificationSettings(settings) application.registerForRemoteNotifications() }
修复后的APNs注册回调
// 修正方法签名,添加下划线,参数类型改为Data func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken // 拿到APNs令牌后再获取FCM令牌,避免报错 Messaging.messaging().token { token, error in if let error = error { print("Error fetching FCM registration token: \(error)") } else if let token = token { print("FCM registration token: \(token)") // 此处可添加令牌上传到业务服务器的逻辑 } } }
额外校验项
- 确认Xcode的
Signing & Capabilities中已添加Push Notifications能力 - 确认
Background Modes中已勾选Remote notifications选项 - 测试必须使用真机,模拟器不支持APNs推送
- 修复后清空应用重新运行,拿新生成的FCM令牌在Firebase控制台发测试推送即可正常接收
内容的提问来源于stack exchange,提问作者Abd Alrahman Alhayek
相关产品推荐
相关产品推荐

