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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 16:06:03