无法使用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
相关产品推荐
相关产品推荐

