iOS 12应用Firebase推送突然失效问题求助
iOS 12 Firebase推送突然失效的排查与修复建议
看起来你遇到了iOS端Firebase推送突然罢工的棘手问题——之前运行完全正常,突然彻底失效,Android端却不受影响,确实挺闹心的。结合你描述的症状和提供的代码,我整理了几个针对性的排查方向和修复建议,你可以逐一尝试:
1. 调整APNs Token设置的时序逻辑
你当前在didRegisterForRemoteNotificationsWithDeviceToken里先执行InstanceID.instanceID().deleteID异步操作,再设置APNs Token,这里可能存在时序冲突:deleteID会重置InstanceID,异步回调里直接设置Token可能导致FCM与APNs的绑定失效。建议调整顺序并完善异步逻辑:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // 优先完成APNs Token绑定 Messaging.messaging().setAPNSToken(deviceToken, type: .prod) Messaging.messaging().delegate = self Messaging.messaging().shouldEstablishDirectChannel = true // 处理InstanceID删除,确保异步完成后重新获取有效Token InstanceID.instanceID().deleteID { error in if let error = error { print("删除旧InstanceID失败: \(error.localizedDescription)") } else { print("旧InstanceID删除成功,重新获取FCM Token") Messaging.messaging().token { token, error in guard let token = token, error == nil else { print("获取新FCM Token失败: \(error?.localizedDescription ?? "未知错误")") return } print("新FCM Token: \(token)") // 这里再执行Token存储、上传服务器的逻辑 KeychainProvider.setToken(token: token) appCoord.updateToken() Messaging.messaging().subscribe(toTopic: "news") } } } }
2. 确认APNs环境与打包配置匹配
你当前固定设置type: .prod,但如果应用是用开发证书打包测试,必须切换为.sandbox;只有Ad Hoc或App Store包才用.prod。环境不匹配会直接导致推送被APNs拒绝:
#if DEBUG Messaging.messaging().setAPNSToken(deviceToken, type: .sandbox) #else Messaging.messaging().setAPNSToken(deviceToken, type: .prod) #endif
3. 检查服务器端的推送请求配置
因为你的设备是通过Web应用在服务器注册,需要确认:
- 服务器存储的是最新的FCM Token:你调用了deleteID会触发FCM Token刷新,如果服务器仍在使用旧Token,推送必然失败;
- 服务器发送推送时,是否携带了iOS 12+要求的必要字段:
apns-push-type(设为alert)和apns-topic(你的App Bundle ID),缺少这些字段会被APNs拦截。
4. 验证Firebase控制台的APNs证书配置
虽然你无权访问Firebase服务器,但可以请有权限的同事检查:
- 上传的APNs开发/生产证书是否过期;
- 证书对应的Bundle ID是否与你的应用完全一致;
- 证书类型是否与当前打包环境匹配(开发证书不能用于生产包)。
证书失效或配置错误是iOS推送突然失效的常见原因,且不会影响Android端。
5. 确认项目后台模式配置
检查Xcode项目的Capabilities -> Background Modes,确保Remote notifications选项已勾选。如果这个配置被意外关闭,后台推送会完全无法接收,甚至影响前台回调触发。
6. 排除设备与环境异常
- 换一台测试设备尝试推送,排除单设备的APNs连接异常;
- 用Firebase控制台直接发送测试推送(填入当前设备的FCM Token),如果控制台推送也失败,问题集中在客户端或Firebase配置;如果控制台能收到,说明服务器的推送请求存在问题。
内容的提问来源于stack exchange,提问作者Phantom454
相关产品推荐
相关产品推荐

