Expo推送通知在EAS开发构建中失效问题求助
问题:EAS构建的开发版应用无法接收Expo推送通知(Expo GO正常)
我基于Node.js实现了Expo推送通知功能,代码在Expo GO中可以正常收发通知,但通过EAS构建开发版应用后,推送通知无法正常发送或接收。目前已确认前端能正确获取推送令牌,且使用Expo网页推送工具测试该令牌可正常收到通知,按理解后端代码不应受构建方式影响,特此求助解决方案。
后端实现代码
let expo = new Expo({ accessToken: process.env.EXPO_ACCESS_TOKEN, useFcmV1: true }); con.query( `SELECT expo_push_token,online_status FROM user WHERE id="${id}"`, function (err, result_status, fields) { if (err) { res.send("Fail"); throw err; } let messages = []; messages.push({ to: result_status[0].expo_push_token, sound: 'default', title: "TestNotification", body: `${user_name} has sent a message`, data: { withSome: 'data' }, }); let chunks = expo.chunkPushNotifications(messages); let tickets = []; (async () => { for (let chunk of chunks) { try { let ticketChunk = await expo.sendPushNotificationsAsync(chunk); console.log(ticketChunk); tickets.push(...ticketChunk); } catch (error) { console.error(error); } } })(); } );
可能的原因及解决方案
1. 检查EAS开发版的推送权限配置
- 确认
app.json或app.config.js中已配置推送相关权限:- iOS:添加
ios.infoPlist.NSUserNotificationUsageDescription字段,说明通知用途 - Android(13+):在
android.permissions中添加POST_NOTIFICATIONS权限
- iOS:添加
- EAS构建的开发版可能默认未开启完整权限,需手动配置确保应用能请求并获取通知权限。
2. 完善异步代码的错误处理与状态检查
原代码中的异步推送逻辑是立即执行的匿名函数,没有等待完成也未处理错误ticket,容易导致问题被隐藏。建议修改为:
con.query( `SELECT expo_push_token,online_status FROM user WHERE id="${id}"`, async function (err, result_status, fields) { if (err) { res.send("Fail"); throw err; } let messages = []; messages.push({ to: result_status[0].expo_push_token, sound: 'default', title: "TestNotification", body: `${user_name} has sent a message`, data: { withSome: 'data' }, }); let chunks = expo.chunkPushNotifications(messages); let tickets = []; try { for (let chunk of chunks) { let ticketChunk = await expo.sendPushNotificationsAsync(chunk); tickets.push(...ticketChunk); } // 检查每个ticket的状态,定位错误 for (let ticket of tickets) { if (ticket.status === 'error') { console.error(`推送失败: ${ticket.message}, 详情: ${JSON.stringify(ticket.details)}`); } } res.send("Success"); } catch (error) { console.error("推送请求失败:", error); res.send("Fail"); } } );
通过这段代码可以捕获完整的错误信息,包括Expo返回的ticket错误详情,帮助定位具体问题。
3. 确认FCM V1配置是否适配EAS构建
- 如果你启用了
useFcmV1: true,需确保Expo项目已正确配置FCM服务账号:- 在
app.config.js中添加android.googleServicesFile指向你的google-services.json文件 - 确认EAS构建时该文件已被正确打包进应用,FCM配置生效
- 在
4. 验证推送令牌的环境一致性
- 确认EAS开发版获取的推送令牌与Expo GO的令牌属于同一Expo项目ID
- 检查数据库中存储的
expo_push_token是否正确,未混淆不同环境的令牌
内容的提问来源于stack exchange,提问作者Anirudh S
相关产品推荐
相关产品推荐

