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

无法使用EXPO推送通知:React Native应用收不到通知求助

排查Expo React Native推送通知收不到的问题

嘿,我来帮你一步步揪出推送通知收不到的问题!先从几个最容易踩的坑开始检查:

1. 确认通知权限是否正确获取

你代码里提到的Permi...应该是权限相关的代码没写完吧?现在Expo已经把通知权限整合到expo-notifications模块里了,一定要确保用户授权了通知权限:

import * as Notifications from 'expo-notifications';

// 检查并请求通知权限的函数
async function ensureNotificationPermissions() {
  const { status } = await Notifications.getPermissionsAsync();
  if (status !== 'granted') {
    const { status: newStatus } = await Notifications.requestPermissionsAsync();
    if (newStatus !== 'granted') {
      alert('必须开启通知权限才能接收推送哦!');
      return false;
    }
  }
  return true;
}

// 在组件挂载时调用这个函数
useEffect(() => {
  ensureNotificationPermissions();
}, []);

另外,别忘了在app.json里配置通知基础信息(Android必填,iOS建议配置):

{
  "expo": {
    "notifications": {
      "icon": "./assets/notification-icon.png",
      "color": "#2196F3",
      "androidMode": "default",
      "androidCollapsedTitle": "你的应用名称"
    }
  }
}

2. 验证Expo Push Token是否有效

推送通知必须依赖正确的Expo Push Token,先确认你拿到的token是有效的:

async function getValidPushToken() {
  try {
    const { data: token } = await Notifications.getExpoPushTokenAsync();
    console.log('当前设备的Expo Push Token:', token);
    // 把这个token复制下来,用Expo的推送测试工具验证
    return token;
  } catch (error) {
    console.error('获取Push Token失败:', error);
    alert('获取推送令牌失败,请检查权限设置');
    return null;
  }
}

拿到token后,用Expo官网的推送测试工具输入这个token发送测试通知。如果工具都发不了,问题肯定在客户端配置;如果工具能收到但你的后端发不了,那就是后端的请求格式有问题。

3. 检查推送请求的格式是否正确

不管是自己的后端还是测试工具,发送给Expo推送API的请求必须符合格式要求:

{
  "to": "你的Expo Push Token",
  "sound": "default",
  "title": "测试通知标题",
  "body": "这是一条测试推送内容",
  "data": { "key": "value" } // 可选的自定义数据
}

注意:请求的Content-Type必须是application/json,别把to写成token这类拼写错误。

4. 处理应用不同状态下的通知

Expo的通知在前台、后台、应用关闭时的表现不一样:

  • 前台收到通知:默认不会弹出系统通知栏,需要你自己通过监听处理(比如弹出Alert或者自定义弹窗)
  • 后台/应用关闭:会弹出系统通知栏,但需要确保设备没有拦截通知

添加监听代码来处理这些情况:

useEffect(() => {
  // 监听前台收到的通知
  const foregroundListener = Notifications.addNotificationReceivedListener(notification => {
    console.log('前台收到通知:', notification);
    // 这里可以自定义前台通知的展示方式,比如:
    alert(`${notification.request.content.title}\n${notification.request.content.body}`);
  });

  // 监听用户点击通知的事件
  const responseListener = Notifications.addNotificationResponseReceivedListener(response => {
    console.log('用户点击了通知:', response);
    // 可以在这里处理点击后的跳转逻辑
  });

  // 组件卸载时移除监听
  return () => {
    foregroundListener.remove();
    responseListener.remove();
  };
}, []);

5. 检查设备和系统的限制

  • iOS:去「设置」→「通知」→ 找到你的应用,确保「允许通知」是开启的,并且开启了「横幅」「声音」等选项。
  • Android:很多国产手机(小米、华为、OPPO等)有严格的省电策略,会拦截后台推送。要把你的应用加到「省电白名单」,关闭「后台限制」;另外去应用的通知设置里,确保所有通知渠道都是开启的。

6. 确认SDK版本兼容性

确保你的expo-notifications版本和Expo SDK版本匹配,建议使用最新的稳定版。可以运行expo upgrade来升级到最新兼容的版本,避免旧版本的bug。

如果以上步骤都排查完还是收不到通知,麻烦把完整的代码(包括权限请求、token获取、app.json配置)贴出来,我再帮你进一步分析!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:40:08