You need to enable JavaScript to run this app. Expo 40.0.0 Android独立应用推送通知失效,iOS正常,getExpoPushTokenAsync无响应
优惠活动
大模型
产品
解决方案
定价
更多

Expo 40.0.0 Android独立应用推送通知失效,iOS正常,getExpoPushTokenAsync无响应

Expo 40 版本 Android 端推送 Token 获取卡死排查方案

核心配置校验

  • 核对google-services.json内的包名与app.json中android.package字段值完全匹配:包名存在大小写差异、前后缀不一致时,Firebase 服务会静默拒绝连接,导致getExpoPushTokenAsync底层获取不到 FCM Token,Promise 永远处于 pending 状态且不会抛出错误。Expo 40 版本对这类配置错误没有显式的运行时报错。
  • 确认调试环境:Expo Go 客户端绑定的是 Expo 官方的 Firebase 项目,无法加载项目自定义的google-services.json配置。若当前是在 Expo Go 环境下调试推送功能,自定义 Firebase 配置完全不会生效,必然出现 Token 获取卡死的问题,必须通过自定义开发构建(即打专属 debug 安装包)加载自身配置后才能正常调试。
  • 检查依赖版本匹配:确保package.json中expo-notifications包版本为0.40.x,与 Expo 40 SDK 严格对齐,版本错配会导致原生模块通信异常,方法调用无返回。

代码逻辑修正

你现有代码存在执行顺序硬伤,是导致问题的常见诱因:
当前代码在真机场景下,调用getExpoPushTokenAsync拿到结果后会直接执行return退出函数,后续的 Android 通知通道初始化代码Notifications.setNotificationChannelAsync永远不会被执行。缺少通道初始化的情况下,Android 端通知 SDK 无法完成完整初始化,会直接阻塞 Token 获取流程。
可参考如下修正后的逻辑顺序调整代码:

export async function registerForPushNotificationsAsync(t) {
  // 优先完成Android端通知通道初始化
  if (Platform.OS === 'android') {
    Notifications.setNotificationChannelAsync('default', {
      name: 'default',
      importance: Notifications.AndroidImportance.MAX,
      vibrationPattern: [0, 250, 250, 250],
      lightColor: '#FF231F7C',
    });
  }

  if (!Constants.isDevice) {
    console.log("No physical device");
    return;
  }

  // 权限申请流程
  const { status: existingStatus } = await Permissions.getAsync(Permissions.NOTIFICATIONS);
  let finalStatus = existingStatus;
  if (existingStatus !== 'granted') {
    const { status } = await Permissions.askAsync(Permissions.NOTIFICATIONS);
    finalStatus = status;
  }
  if (finalStatus !== 'granted') {
    alert(t('no_access_push_notifications'));
    return;
  }

  // 给Token获取增加超时捕获,避免无期限阻塞
  try {
    const token = await Promise.race([
      Notifications.getExpoPushTokenAsync(),
      new Promise((_, reject) => 
        setTimeout(() => reject(new Error('获取推送Token超时')), 10000)
      )
    ]);
    return token;
  } catch (e) {
    console.error('推送Token获取失败', e);
  }
};

其他可能触发卡死的场景

  • 网络环境限制:getExpoPushTokenAsync需要将本地获取到的 FCM Token 上报到 Expo 服务端换取对应的 Expo Push Token,若网络环境无法正常访问 Expo 服务、未正确配置代理,上报请求会一直挂起,导致整个流程无返回。
  • app.json 配置校验:确认googleServicesFile指向的路径是项目根目录下的真实文件,不存在路径写错、文件版本匹配错误的问题;useNextNotificationsApi配置项需正确放置在android字段下,位置错误会导致配置不生效,退回旧版通知API后无法在 Android 8.0+ 系统上正常获取 FCM Token。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 20:45:06