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

升级Expo至50.0.7后React Native Firebase Messaging注册矛盾报错

解决Expo 50升级后@react-native-firebase/messaging令牌获取矛盾问题

问题分析

你遇到的核心矛盾源于Expo 50升级后,推送权限处理逻辑与RN Firebase自动注册机制的适配冲突:调用getToken时提示未注册远程消息,要求调用registerDeviceForRemoteMessages;但执行该方法后又收到警告,称默认自动注册已开启,无需手动调用。同时缺少firebase.json文件导致配置规则不明确,最终无法正常获取设备令牌。

解决方案

1. 先确保推送权限已完成用户授权(iOS核心步骤)

iOS平台下,用户未授权推送权限时,RN Firebase的自动注册机制不会触发,这是getToken报错的根本原因。先添加权限请求逻辑:

import { Platform } from 'react-native';
import messaging from '@react-native-firebase/messaging';

// 推送权限请求函数
const requestNotificationPermission = async () => {
  if (Platform.OS === 'ios') {
    const authStatus = await messaging().requestPermission({
      alert: true,
      badge: true,
      sound: true,
    });
    return authStatus === messaging.AuthorizationStatus.AUTHORIZED || 
           authStatus === messaging.AuthorizationStatus.PROVISIONAL;
  }
  return true; // Android默认开启推送权限
};

2. 优化令牌获取逻辑,移除不必要的手动注册

无需手动调用registerDeviceForRemoteMessages,按「权限请求→获取令牌」的流程执行即可:

export const fetchMessagingToken = async (uid) => {
  try {
    const hasPermission = await requestNotificationPermission();
    if (!hasPermission) {
      console.log('用户未授权推送权限,无法获取令牌');
      return;
    }

    const token = await messaging().getToken();
    await saveTokenToUser(uid, token);
  } catch (error) {
    console.log("FETCH MESSAGING TOKEN ERROR:", error);
  }
};

3. 创建firebase.json明确自动注册配置

创建该文件可消除警告并明确配置规则,在项目根目录新建firebase.json,添加内容:

{
  "react-native": {
    "messaging_ios_auto_register_for_remote_messages": true
  }
}

4. 清理缓存并重新构建项目

Expo升级后的缓存可能导致配置不生效,执行以下操作:

  • 清除Expo缓存:npx expo start --clear
  • 重新构建原生项目:npx expo run:ios 或 npx expo run:android

关键说明

  • Expo 50对推送权限的处理更严格,必须用户显式授权后,RN Firebase的自动注册机制才会启动。
  • 手动调用registerDeviceForRemoteMessages仅适用于主动关闭自动注册的场景,默认配置下无需执行该操作。

内容的提问来源于stack exchange,提问作者David Henry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:42:54