You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

接入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:24:02