iOS Swift环境下FCM推送通知无法接收的问题求助
解决FCM注册成功但收不到推送通知的问题
我之前也踩过FCM推送的类似坑,结合你描述的情况——FCM连接正常、能拿到设备令牌,但就是收不到通知,已经开启了推送通知和后台远程通知权限,给你梳理几个关键排查点:
1. 检查设备令牌的格式是否正确
你代码里用了deviceToken.description.trimming...,这里很容易出问题!因为Data的description方法返回的字符串会带有<和>,还有空格,而FCM需要的是纯十六进制字符串。
正确的令牌转换代码应该是这样:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let fcmToken = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() print("正确的FCM令牌: \(fcmToken)") // 这里把令牌发送到你的服务器或者直接用这个令牌测试推送 }
如果令牌格式不对,FCM根本无法识别你的设备,自然发不出通知。
2. 确认APNs证书/密钥与FCM配置匹配
- 检查Apple开发者后台的APNs证书:确保你创建的是**对应环境(开发/生产)**的推送证书,且bundle ID和项目完全一致(大小写都不能错)。
- 检查FCM控制台的配置:如果你用的是APNs密钥,要确保密钥是有效的,并且关联了你的App ID;如果用的是证书,要把正确的.p12文件上传到FCM。
3. 确认用户已授权通知权限
虽然你在Capabilities里开了权限,但用户可能在App启动时拒绝了通知请求。一定要在代码里主动请求权限:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 请求通知权限 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in if let error = error { print("请求通知权限失败: \(error.localizedDescription)") return } guard granted else { print("用户拒绝了通知权限") return } // 权限获取成功后注册远程通知 DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } // 其他初始化代码... return true }
如果用户没授权,APNs不会把通知推送到设备上。
4. 检查FCM推送的Payload格式
测试推送时,要确保Payload符合APNs和FCM的要求:
- 通知消息(由APNs自动展示)需要包含
notification字段,同时apns.payload里要有aps结构:
{ "to": "你的设备令牌", "notification": { "title": "测试标题", "body": "测试内容" }, "apns": { "payload": { "aps": { "sound": "default", "badge": 1 } } } }
- 如果是数据消息(需要App自己处理),要确保
content_available设为true(后台接收需要),并且在didReceiveRemoteNotification方法里手动处理展示逻辑。
5. 验证后台模式配置是否生效
除了在Capabilities里勾选“Remote notifications”,还要手动检查Info.plist文件,确认UIBackgroundModes数组里包含remote-notification。有时候Xcode的Capabilities勾选可能没同步到plist,手动添加更保险。
6. 确保测试环境正确
- 不要用模拟器测试推送!模拟器不支持APNs,必须用真机。
- 如果是Xcode真机调试,FCM要选开发环境;如果是Ad Hoc或App Store版本,要切换到生产环境。
如果以上都排查过还是没解决,建议打开Xcode的控制台,搜索“APNs”或“FCM”关键词,看看有没有错误日志(比如令牌无效、证书验证失败等),这些日志能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者PvDev
相关产品推荐
相关产品推荐

