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

Expo推送API发送data对象异常问题求助

Expo推送API发送data对象异常问题求助

我前端用的是Expo Go + Expo 48,后端用Firebase Admin SDK,通过Cloud Functions调用Expo推送API发通知。

之前发送带body的通知一切正常,但最近(已经5天了)只要尝试在通知里加data对象,就出问题:要么完全收不到通知,要么收到了但data是null。我用的expo-notifications版本是0.18.1。

之前一切正常,突然就出现这个问题了,求帮忙排查!


补充:对应两张截图的代码

后端Cloud Functions推送代码

const message = {
  to: expoPushToken,
  sound: 'default',
  title: '新通知',
  body: '你有一条新的评论',
  data: { 
    postId: 'post_12345',
    notificationType: 'comment'
  },
};

await fetch('https://exp.host/--/api/v2/push/send', {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Accept-encoding': 'gzip, deflate',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(message),
});

前端Expo通知监听代码

import * as Notifications from 'expo-notifications';

// 监听前台收到通知
Notifications.addNotificationReceivedListener(notification => {
  const { data } = notification.request.content;
  console.log('前台收到的通知data:', data);
  // 这里有时打印null,或者根本触发不到这个监听
});

// 监听通知点击事件
Notifications.addNotificationResponseReceivedListener(response => {
  const { data } = response.notification.request.content;
  console.log('点击通知时的data:', data);
});

给你几个排查的方向,都是实际踩过坑的经验:

  1. 先做最小化测试,排除数据本身的问题
    先把data改成最简单的结构,比如data: { test: 'hello' },不要带复杂嵌套或者大体积数据。Expo推送API对data的大小有限制(大概4KB以内),如果数据超标可能会被静默拒绝,或者截断后导致前端解析出null。

  2. 核对版本兼容性,试试小版本升级
    Expo 48对应的expo-notifications推荐版本是多少?你现在用的0.18.1,会不会是最近Expo推送服务对旧版本的兼容性做了调整?可以去Expo官方文档查一下Expo 48的依赖版本表,把expo-notifications升级到同大版本下的最新小版本(比如0.18.x的最新版),再测试看看。

  3. 给后端加日志,看Expo的返回结果
    现在的代码里有没有捕获Expo推送API的响应?可以在Cloud Functions里加日志,打印请求的响应内容,比如:

    const response = await fetch(/* 推送API地址 */);
    const responseData = await response.json();
    console.log('Expo推送响应:', responseData);
    

    这样能直接看到是Expo那边返回了错误(比如令牌无效、数据格式错误),还是请求根本没发出去,能快速定位是后端请求的问题,还是前端接收的问题。

  4. 排查设备端的缓存和权限
    有时候Expo Go的缓存会出问题,你可以试试在设备上重启Expo Go,或者清除Expo Go的缓存(设置里找到Expo Go,清除存储),再重新获取推送令牌测试。另外,分别在iOS和Android设备上测试,看是不是某一个系统的问题,两者的通知通道、权限逻辑不一样。

  5. 确认推送令牌的有效性
    推送令牌可能会因为设备重装、系统更新、App卸载重装而失效。你可以在前端重新调用getExpoPushTokenAsync获取最新的令牌,替换后端存储的旧令牌,再发通知测试。

  6. 检查Expo推送服务的状态
    虽然已经5天了,但也可以确认下Expo的推送服务是不是正常运行,不过大概率不是服务故障,但排除一下总是好的。


备注:内容来源于stack exchange,提问作者Kcyr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 11:28:14