接入Firebase Auth手机号验证后OneSignal出现Apns Delegate Never Fired问题
问题解决方案
根因说明
你重写了APNs相关的系统代理方法后,仅处理了Firebase Auth的逻辑,没有将事件同步透传给OneSignal SDK,导致OneSignal无法获取APNs token、也无法接收通知事件,因此后台会标记Apns Delegate Never Fired,即使关闭Firebase Swizzling也不会生效。
修复步骤
1. 修正设备Token回调方法
修改didRegisterForRemoteNotificationsWithDeviceToken,将生成的APNs token同时传递给OneSignal:
override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // 保留原有Firebase Auth逻辑 Auth.auth().setAPNSToken(deviceToken, type: AuthAPNSTokenType.unknown) // 新增:传递token给OneSignal OneSignal.setDeviceToken(deviceToken) }
2. 修正通知接收回调方法
修改didReceiveRemoteNotification,Firebase不处理的通知要透传给OneSignal:
override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { // 保留原有Firebase Auth逻辑 if Auth.auth().canHandleNotification(userInfo) { completionHandler(.noData) return } // 新增:将通知事件传递给OneSignal处理 let isProcessedByOneSignal = OneSignal.didReceiveRemoteNotification(userInfo, fetchCompletionHandler: completionHandler) // 若OneSignal也未处理该通知,调用默认完成回调 if !isProcessedByOneSignal { completionHandler(.noData) } }
额外检查项
确保OneSignal的初始化逻辑放在application:didFinishLaunchingWithOptions:的靠前位置,晚于Firebase初始化即可,不要放在推送权限申请完成后才初始化。
验证排查步骤
- 确认Info.plist中
FirebaseAppDelegateProxyEnabled已正确设置为Boolean类型的NO,完全关闭Firebase的方法交换 - 用真机运行App,允许推送权限后,查看OneSignal后台对应设备的状态,
Apns Delegate Never Fired标识会消失 - 在OneSignal后台发送测试推送,确认应用可以正常接收通知
- 如果仍有异常,开启OneSignal的debug日志,排查初始化、token传递环节的报错信息
内容的提问来源于stack exchange,提问作者moonvader
相关产品推荐
相关产品推荐

