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

使用Stack Navigation时Expo推送通知失效,单页App正常

解决多导航栈下Expo Push Notifications无法接收的问题

以下是经过验证的实用解决方案,适配带认证栈+已认证栈的多导航结构React Native Expo应用:

1. 将通知初始化逻辑固定在App根组件

把通知权限请求、令牌获取、监听器注册全部放在App根组件的useEffect中,依赖项设为空数组,确保应用启动时仅执行一次,不受导航栈切换影响。子栈组件的挂载/卸载不会干扰根组件的通知配置。

示例代码:

import { useEffect } from 'react';
import * as Notifications from 'expo-notifications';
import { NavigationContainer } from '@react-navigation/native';
import AuthStack from './AuthStack';
import AppStack from './AppStack';
import { useAuth } from './AuthContext';

export default function App() {
  const { user } = useAuth();

  useEffect(() => {
    const setupNotifications = async () => {
      // 请求通知权限
      const { status } = await Notifications.requestPermissionsAsync();
      if (status !== 'granted') return;

      // 配置通知展示规则
      Notifications.setNotificationHandler({
        handleNotification: async () => ({
          shouldShowAlert: true,
          shouldPlaySound: true,
          shouldSetBadge: false,
        }),
      });

      // 获取并同步Expo推送令牌
      const token = await Notifications.getExpoPushTokenAsync({
        projectId: '你的Expo项目ID',
      });
      console.log('当前推送令牌:', token.data);
      // 将令牌发送至后端存储,供FCM推送使用

      // 监听前台通知接收事件
      const foregroundListener = Notifications.addNotificationReceivedListener(notification => {
        console.log('前台收到通知:', notification);
      });

      // 监听通知点击事件
      const responseListener = Notifications.addNotificationResponseReceivedListener(response => {
        console.log('通知被点击:', response);
        // 可根据通知内容跳转指定页面,例如:
        // navigationRef.current?.navigate('TargetScreen');
      });

      // 组件卸载时清理监听器
      return () => {
        foregroundListener.remove();
        responseListener.remove();
      };
    };

    setupNotifications();
  }, []); // 空依赖确保逻辑仅执行一次

  return (
    <NavigationContainer>
      {user ? <AppStack /> : <AuthStack />}
    </NavigationContainer>
  );
}

2. 禁止在子栈组件中重复初始化通知

不要在登录、注册或其他子页面中再次执行通知注册逻辑,重复的权限请求或令牌获取可能导致冲突,使之前的注册失效。

3. 验证推送令牌一致性

多栈切换后,对比控制台打印的令牌与单栈应用时的令牌是否一致。如果令牌变化,需将新令牌同步到后端,确保FCM使用最新令牌发送通知。

4. 排查导航状态变化的影响

如果登录/登出时有重置应用状态的逻辑,确保不会意外清除通知配置或监听器。例如,不要在AuthContext的登录/登出函数中重置令牌或注销监听器。

5. 确认FCM配置与打包环境匹配

  • 检查app.json中android.googleServicesFile路径是否正确指向Firebase的google-services.json文件
  • 打包APK使用的keystore指纹(SHA-1、SHA-256)需已在Firebase控制台配置完成
  • 验证Expo项目ID与FCM关联的项目完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:43:29