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

Android生产构建expo-notifications无法接收推送通知求助

Android生产环境Expo推送Token生成失败修复方案

问题特征

  • Expo+Firebase配置的推送通知功能稳定运行1.5个月,无代码改动前提下2天前生产构建突然无法接收通知
  • 异常仅在Android平台出现:getExpoPushTokenAsync()无法生成推送token,iOS功能完全正常
  • Expo Go开发环境下通知、token生成逻辑全量正常,仅独立生产构建触发异常
  • FCM相关配置已确认全部正确

核心根因

Expo推送服务近期上线了生产环境请求校验规则,Android端生产构建调用getExpoPushTokenAsync()时必须显式传入当前项目的projectId,此前未强制校验时不传参数可正常返回token,校验规则上线后未传参的请求会被服务端直接拦截,导致拿不到token。开发环境因为Expo Go内置了项目关联逻辑,不受该规则影响,和描述的症状完全匹配。

修复步骤

  • 补全方法必填参数:从Expo控制台项目设置页复制你的项目ID,调用getExpoPushTokenAsync时显式传入,这一步能解决90%以上同场景问题。
  • 调整代码执行顺序:将Android通知渠道初始化逻辑移到权限申请、token获取逻辑之前,避免系统通知通道未初始化导致的隐性异常。
  • 补充错误捕获逻辑:现有代码未对token获取流程加异常捕获,失败时会直接静默返回,加上try/catch打印错误日志,后续出现问题可直接定位根因。
  • 校验构建配置:确认EAS构建配置中googleServicesFile指向的是正式环境匹配的google-services.json文件;如果开启了R8/代码混淆,添加规则保留Expo通知、Firebase相关类,避免类被裁剪导致方法调用失败。

修正后代码示例

const registerForPushNotificationsAsync = async () => {
  let token;
  if (!Device.isDevice) return token;

  // Android端先初始化通知渠道
  if (Platform.OS === "android") {
    await Notification.setNotificationChannelAsync("default", {
      name: "default",
      importance: Notification.AndroidImportance.MAX,
      vibrationPattern: [0, 250, 250, 250],
      lightColor: "#FF231F7C",
    });
  }

  const { status: existingStatus } = await Notification.getPermissionsAsync();
  let finalStatus = existingStatus;
  if (existingStatus !== "granted") {
    const { status } = await Notification.requestPermissionsAsync();
    finalStatus = status;
  }
  if (finalStatus !== "granted") return;

  try {
    // 显式传入projectId,替换为你自己的Expo项目ID
    token = (await Notification.getExpoPushTokenAsync({
      projectId: '替换为你的Expo项目ID'
    })).data;
  } catch (err) {
    console.log('获取推送token失败:', err);
  }

  return token;
};

useEffect(() => {
  const tokenValidity = checkJwtValidity(
    jwtToken,
    setIsLoggedIn,
    setjwtToken,
    setUser
  );
  if (!tokenValidity) return;
  
  registerForPushNotificationsAsync().then(async (token) => {
    if (!token) return;
    const response = await sendDeviceNotificationToken(jwtToken, token);
    console.log(response);
  });
}, []);

注意:重新构建生产版本前,确认本地依赖的expo-notifications版本和你项目SDK版本匹配,不要跨大版本混用依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:42:24