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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:30:23