使用Expo在App后台发送推送通知的机制及触发方式咨询
刚好对Expo的推送通知这块摸得门清,来给你详细唠唠~
Expo后台状态下的推送通知机制
首先得区分App的两种后台状态,表现不太一样:
- 后台挂起状态(App完全退到后台,没有任何后台任务在运行):推送通知会直接弹在系统通知栏里,只有用户点击通知后才会唤醒App。这时你可以通过
NotificationReceivedListener或者NotificationResponseReceivedListener来处理后续逻辑,但要注意iOS对后台唤醒后的处理时间有严格限制(大概30秒左右,超时会被系统终止)。 - 后台运行状态(比如App有后台同步任务在执行):
- Android:只要App没被系统彻底杀死,就能直接接收并处理推送,甚至可以配置成不展示通知栏提醒(通过调整推送payload里的
priority或者content_available参数)。 - iOS:需要在推送payload里带上
content_available: true,系统才会唤醒App的后台进程,你可以在NotificationReceivedListener里做一些轻量操作(比如同步数据),但同样有时间限制;如果用户手动把App从后台划掉,这个唤醒机制就失效了。
- Android:只要App没被系统彻底杀死,就能直接接收并处理推送,甚至可以配置成不展示通知栏提醒(通过调整推送payload里的
服务器触发与提前调度支持
这俩需求Expo都完全支持,分两种情况说:
- 服务器触发推送:绝对没问题!Expo提供了官方的Push API,你可以在自己的后端服务里调用这个API,给指定的Expo推送令牌发送通知——不管App是前台还是后台,只要设备在线(或者后续恢复网络)都能收到。给你贴个简单的Node.js示例代码:
import { Expo } from 'expo-server-sdk'; const expo = new Expo(); // 构造推送消息 const pushMessages = [{ to: '用户的EXPO推送令牌', sound: 'default', title: '服务器推送通知', body: '这是后端触发的后台推送', data: { customData: '你可以带自定义业务数据' }, // iOS需要这个参数才能触发后台唤醒处理 content_available: true }]; // 按Expo要求拆分消息(避免单请求消息过多) const messageChunks = expo.chunkPushNotifications(pushMessages); // 循环发送每个消息块 for (const chunk of messageChunks) { try { const receipts = await expo.sendPushNotificationsAsync(chunk); console.log('推送回执:', receipts); } catch (error) { console.error('推送失败:', error); } } - 提前调度推送:有两种实现方式:
- 客户端本地调度:用Expo提供的
Notifications.scheduleNotificationAsync()方法,在App里提前设置好推送的时间,哪怕App处于后台或者被关闭(只要设备没关机),到点系统都会自动触发通知。适合做比如日程提醒这类本地触发的功能。 - 服务器端调度:如果你想在后端控制推送时间,Expo的Push API本身不支持直接设置未来发送时间,所以需要你自己在后端搭建定时任务(比如用Node.js的
node-schedule、Java的Quartz,或者云服务商的定时函数),到预定时间再调用Expo的Push API发送通知。
- 客户端本地调度:用Expo提供的
额外注意事项
- iOS端:必须在
app.json里配置ios.infoPlist.UIBackgroundModes包含remote-notification,否则后台推送的唤醒逻辑完全不生效。 - Android端:要注意厂商的电池优化策略,有些机型会限制后台App的推送接收,可能需要引导用户把App加入白名单或者关闭电池优化。
- 推送令牌是和设备、App实例绑定的,用户卸载重装App后令牌会变更,记得在后端及时更新令牌列表,避免推送失败。
内容的提问来源于stack exchange,提问作者eth.block
相关产品推荐
相关产品推荐

