iOS React Native应用中无法生成FCM Token问题排查
解决iOS React Native FCM随机出现"No APNS token specified before fetching FCM Token"的问题
这个随机报错的核心原因是FCM尝试获取Token时,iOS系统的APNS Token还未生成或返回。APNS Token的获取是系统级异步操作,App启动速度、系统状态等因素都会影响它的就绪时机,导致有时能成功拿到FCM Token,有时触发错误。
以下是针对性的解决步骤:
1. 确保在APNS Token就绪后再获取FCM Token
修改你的Token获取逻辑,先完成通知权限请求,等待APNS Token生成后再调用getToken():
import { AsyncStorage, AppState } from 'react-native'; import messaging from '@react-native-firebase/messaging'; // 请求通知权限 async function requestNotificationPermission() { const authStatus = await messaging().requestPermission(); return authStatus === messaging.AuthorizationStatus.AUTHORIZED || authStatus === messaging.AuthorizationStatus.PROVISIONAL; } async function GetFCMToken() { let storedToken = await AsyncStorage.getItem('fcmtoken'); console.log(storedToken, 'old token'); if (!storedToken) { try { // 先确保用户已授权通知 const hasPermission = await requestNotificationPermission(); if (!hasPermission) { console.log('用户未授权通知,无法获取FCM Token'); return; } // 检查APNS Token是否已就绪 const apnsToken = await messaging().getAPNSToken(); if (!apnsToken) { // 若APNS Token未就绪,监听Token刷新事件 const unsubscribe = messaging().onTokenRefresh(async (newToken) => { console.log(newToken, 'refreshed token'); await AsyncStorage.setItem('fcmtoken', newToken); unsubscribe(); // 拿到后取消监听 }); return; } // APNS Token就绪后,安全获取FCM Token const newToken = await messaging().getToken(); if (newToken) { console.log(newToken, 'new token'); await AsyncStorage.setItem('fcmtoken', newToken); } } catch (error) { console.log(error, 'error in fcmtoken'); } } } // 在App进入前台时触发Token检查,确保系统完成APNS初始化 AppState.addEventListener('change', (state) => { if (state === 'active') { GetFCMToken(); } });
2. 优化FCM初始化时机
避免在App启动时立刻调用GetFCMToken(),建议在:
- 用户首次打开App并授权通知后
- App从后台切换到前台时(如上面代码中的
AppState监听) - 收到系统推送的
didRegisterForRemoteNotificationsWithDeviceToken回调后
3. 排查配置细节
- 确认Xcode项目的
Capabilities中已勾选Push Notifications,并开启了Background Modes下的Remote notifications - 检查Firebase控制台中上传的APNS证书(开发/生产环境)是否与当前App的Bundle ID匹配,且未过期
- 务必使用真机测试,iOS模拟器无法获取APNS Token
内容的提问来源于stack exchange,提问作者Divya Jariwala
相关产品推荐
相关产品推荐

