Expo独立构建APK推送通知不显示,但Expo Go环境下正常
这种情况我之前帮不少开发者排查过,Expo Go和独立构建在推送配置上确实藏着不少容易忽略的细节,咱们一步步来梳理解决:
先确认通知权限是否正常请求
Expo Go会自动帮你处理基础的权限请求,但独立构建得手动来。你要确保在App启动的关键节点(比如首页加载时)调用Notifications.requestPermissionsAsync(),而且要判断用户是否真的授权了。如果权限没开,最好加个引导,让用户去系统设置里开启通知权限。Android 8.0+必须配置通知渠道
这是很多人踩坑的点!Android 8.0及以上系统要求所有推送都绑定到通知渠道,Expo Go内置了默认渠道,但独立构建得你自己创建。可以在App初始化时加这段代码:await Notifications.createChannelAsync('default', { name: '默认通知渠道', importance: Notifications.AndroidImportance.MAX, vibrationPattern: [0, 250, 250, 250], lightColor: '#FF231F7C', });而且发送推送时,一定要在Expo Push API的请求参数里加上
channelId: 'default',不然系统会拒收。检查eas.json的权限配置
如果你用的是Android 13及以上版本,必须在eas.json的android构建配置里添加POST_NOTIFICATIONS权限。比如:{ "build": { "production": { "android": { "permissions": ["POST_NOTIFICATIONS"] } } } }旧版本的Android虽然不需要这个权限,但也要确保
RECEIVE_BOOT_COMPLETED这类必要权限没被遗漏。核对推送Payload的格式
Expo Go对Payload的兼容性比较宽松,但独立构建得严格按照规范来。比如必须同时包含title和body,而且要把priority设为high或default(不然后台推送可能被系统压制)。一个标准的Payload示例:{ "to": "你的Expo推送Token", "title": "新消息提醒", "body": "这是一条测试推送", "channelId": "default", "priority": "high" }检查设备端的通知设置
有时候问题出在用户设备上:比如不小心把App的通知权限关了,或者开启了免打扰模式,甚至是通知渠道的声音、横幅被手动禁用了。可以让测试的用户去系统设置里找到你的App,逐一确认这些选项是否正常。用日志排查深层问题
如果上面的步骤都试过还是不行,建议构建一个开发版APK(eas build --profile development),然后用adb logcat命令查看设备日志,搜索“Notification”相关的关键词,通常能找到系统拒收推送的具体原因——比如权限不足、渠道不存在之类的报错信息。
内容来源于stack exchange




