Ionic iOS端Firebase推送双Token问题:是否需存储FCM Token?
Ionic + Firebase推送通知iOS端Token问题解决
问题背景
- 基于Ionic开发iOS/Android跨平台应用,通过Firebase实现推送通知,Android端运行正常:通过
PushNotifications.addListener('registration')回调获取Token并存储到后端 - iOS端出现两个不同Token:
- APNs设备Token:由
didRegisterForRemoteNotificationsWithDeviceToken方法返回,与Ionic的registration回调内获取的Token一致,示例值:639f6c0f86e74db0aaab6889832ad040f00e9e590319a513bacc1579a968f954 - FCM Token:由
MessagingDelegate的didReceiveRegistrationToken方法返回,示例值:fcPGyQDykEP7nvC5k6-JIJ:APA91bEwQ7biKli9LaP4NrB_s3aqzD2iKw7wXc58_OrrN_m3v5zlFjFcWiFX9CUqij-JOppOKwkuh-g60lETrHdt7I9o2yHJXMT8crp7
- APNs设备Token:由
- 实际测试仅FCM Token可正常接收推送,APNs Token无效
核心原因
两个Token的作用完全不同:
- APNs设备Token是苹果原生推送服务的设备标识,仅适用于直接调用APNs接口推送
- FCM Token是Firebase生成的跨平台统一标识,Firebase会自动通过该Token将推送请求路由到对应平台(iOS走APNs,Android走FCM服务),因此使用Firebase推送必须依赖FCM Token
解决方案
需将FCM Token存储到后端,替换原有的APNs Token,具体步骤如下:
1. iOS端传递FCM Token到Ionic层
保留MessagingDelegate实现,修改通知逻辑,让Ionic能监听FCM Token更新:
extension AppDelegate: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { guard let token = fcmToken else { return } print("Firebase registration token: \(token)") // 发送通知给Ionic层 NotificationCenter.default.post( name: Notification.Name("FCMTokenUpdated"), object: nil, userInfo: ["fcmToken": token] ) } }
2. Ionic层监听FCM Token并更新后端
在Ionic代码中添加监听,获取到FCM Token后同步更新用户的mobileToken:
import { Plugins } from '@capacitor/core'; const { App } = Plugins; // 组件初始化时添加监听 App.addListener('FCMTokenUpdated', (info: { fcmToken: string }) => { const fcmToken = info.fcmToken; console.debug('Received FCM Token:', fcmToken); if (user.mobileToken !== fcmToken) { this.authService.getUser().then(response => { user.mobileToken = fcmToken; this.userService.updateUser(user).subscribe(response => { const message = `已为用户 ${user.title} ${user.firstname} ${user.surname} 更新FCM Token`; this.toastService.presentToast('bottom', message, 500); console.debug(message); }, error => { console.error('更新Token失败:', error); }); }); } });
3. 统一跨平台Token逻辑
Android端原本PushNotifications.addListener('registration')回调返回的就是FCM Token,无需修改;iOS端改用FCM Token后,后端只需统一存储FCM Token即可,Firebase会自动处理跨平台的推送路由。
注意事项
- FCM Token会在App重装、设备切换、系统更新等场景下自动更新,必须确保Token更新时同步到后端
- 无需再使用APNs Token,统一依赖FCM Token即可实现Firebase推送
内容的提问来源于stack exchange,提问作者quma
相关产品推荐
相关产品推荐

