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); });
给你几个排查的方向,都是实际踩过坑的经验:
先做最小化测试,排除数据本身的问题
先把data改成最简单的结构,比如data: { test: 'hello' },不要带复杂嵌套或者大体积数据。Expo推送API对data的大小有限制(大概4KB以内),如果数据超标可能会被静默拒绝,或者截断后导致前端解析出null。核对版本兼容性,试试小版本升级
Expo 48对应的expo-notifications推荐版本是多少?你现在用的0.18.1,会不会是最近Expo推送服务对旧版本的兼容性做了调整?可以去Expo官方文档查一下Expo 48的依赖版本表,把expo-notifications升级到同大版本下的最新小版本(比如0.18.x的最新版),再测试看看。给后端加日志,看Expo的返回结果
现在的代码里有没有捕获Expo推送API的响应?可以在Cloud Functions里加日志,打印请求的响应内容,比如:const response = await fetch(/* 推送API地址 */); const responseData = await response.json(); console.log('Expo推送响应:', responseData);这样能直接看到是Expo那边返回了错误(比如令牌无效、数据格式错误),还是请求根本没发出去,能快速定位是后端请求的问题,还是前端接收的问题。
排查设备端的缓存和权限
有时候Expo Go的缓存会出问题,你可以试试在设备上重启Expo Go,或者清除Expo Go的缓存(设置里找到Expo Go,清除存储),再重新获取推送令牌测试。另外,分别在iOS和Android设备上测试,看是不是某一个系统的问题,两者的通知通道、权限逻辑不一样。确认推送令牌的有效性
推送令牌可能会因为设备重装、系统更新、App卸载重装而失效。你可以在前端重新调用getExpoPushTokenAsync获取最新的令牌,替换后端存储的旧令牌,再发通知测试。检查Expo推送服务的状态
虽然已经5天了,但也可以确认下Expo的推送服务是不是正常运行,不过大概率不是服务故障,但排除一下总是好的。
备注:内容来源于stack exchange,提问作者Kcyr

