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
相关产品推荐
相关产品推荐

