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

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权限
  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:10:28