You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Expo推送通知在Expo Go中正常但EAS Android预览构建无法生效的问题咨询

Expo推送通知在Expo Go中正常但EAS Android预览构建无法生效的问题咨询

不用急着切换到OneSignal或者其他第三方服务!Expo自带的Notifications API完全可以在EAS构建的Android应用中正常工作,大概率是你漏了几个原生构建特有的配置步骤,我帮你梳理下排查方向:

一、优先排查Expo原生通知的配置问题

1. 必须配置Firebase Cloud Messaging(FCM)

Expo Go之所以能直接用,是因为它用了Expo官方的FCM配置,但你自己构建的应用必须绑定你自己的Firebase项目:

  • 去Firebase控制台创建项目,添加你的Android应用(包名要和你app.json里的android.package完全一致)
  • 下载生成的google-services.json文件,放到你的项目根目录
  • 在app.json/app.config.js中添加配置:
    "android": {
      "package": "com.your.app",
      "googleServicesFile": "./google-services.json"
    }
    
  • 检查eas.json里的preview构建配置,确保没有覆盖这个设置,比如:
    "preview": {
      "android": {
        "googleServicesFile": "./google-services.json"
      }
    }
    

2. 确认使用的是构建后应用的推送Token

Expo Go的Token和你EAS构建后的Token是完全不同的,因为它们属于不同的应用环境。你需要:

  • 在构建后的应用中,通过Notifications.getExpoPushTokenAsync()获取新的Token
  • 把这个新Token替换到你发送通知的请求里,别再用Expo Go的Token测试了!可以在app里加个简单的弹窗或者日志输出Token,方便你复制测试。

3. 明确请求通知权限(Android 13+)

Android 13及以上版本必须主动请求POST_NOTIFICATIONS权限,Expo Go可能帮你默认处理了,但原生构建的应用要自己实现:

  • 在app启动时调用:
    const { status } = await Notifications.requestPermissionsAsync();
    if (status !== 'granted') {
      Alert.alert('权限不足', '请允许通知权限以接收推送');
      return;
    }
    
  • 确保用户授权后再尝试获取Token和接收通知。

4. 配置Android通知通道(Android 8.0+)

Android 8.0+要求所有通知必须属于一个通知通道,否则系统会直接拦截:

  • 在app初始化时创建通道:
    await Notifications.setNotificationChannelAsync('default', {
      name: 'Default Channel',
      importance: Notifications.AndroidImportance.DEFAULT,
      vibrationPattern: [0, 250, 250, 250],
      lightColor: '#FF231F7C'
    });
    
  • 发送通知时,在消息的android.channelId字段指定这个通道ID(比如上面的default)。

5. 测试推送的正确性

用Expo的Push API直接测试,确保请求格式正确:

  • 用curl命令(或者Postman)发送请求,替换成你自己的构建后Token:
    curl -H "Content-Type: application/json" -X POST "https://exp.host/--/api/v2/push/send" -d '{
      "to": "YOUR_EAS_BUILD_PUSH_TOKEN",
      "title": "测试通知",
      "body": "这是来自EAS构建应用的测试推送",
      "android": {
        "channelId": "default"
      }
    }'
    
  • 查看返回的响应,如果有错误信息,根据提示排查(比如Token无效、权限问题等)。

二、如果还是不行,再考虑免费的替代方案

如果上面的步骤都试过还是没解决,或者你想更简单的集成,可以考虑这些免费的第三方服务:

  • OneSignal:免费额度足够大部分个人/小型项目,集成文档很详细,支持Expo项目,不用太多原生配置
  • Firebase Cloud Messaging(FCM)直接集成:完全免费(在免费额度内),可以跳过Expo的Push API,直接用FCM的SDK发送通知,适合对原生配置熟悉的开发者
  • Pusher Beams:免费版支持一定量的设备和推送,集成也比较简单

总结

90%的情况下,构建后收不到通知都是FCM配置、Token错误、权限或通道没设置的问题,先把这些基础配置排查完,完全不用急着换第三方服务。如果排查过程中遇到具体的错误信息,比如构建日志报错、推送返回的错误码,随时贴出来我再帮你分析!

火山引擎 最新活动