如何限制Expo推送通知单次请求发送量不超过100条?
解决Expo推送通知单次超过100条的分批次发送问题
针对Expo限制单次请求最多发送100条推送的规则,你可以通过将令牌数组拆分为多个100条的分组,逐组调用SDK的推送方法来处理200名关注者的通知需求。
实现步骤
- 拆分令牌数组:把包含200个推送令牌的数组,切割成每100个元素为一组的子数组。
- 逐组验证与发送:对每个分组先过滤无效令牌,再构建推送消息并调用
sendPushNotificationsAsync发送。
完整代码示例
const { Expo } = require('expo-server-sdk'); // 初始化Expo SDK实例 const expo = new Expo(); // 模拟200个关注者的推送令牌集合 const allPushTokens = Array.from({ length: 200 }, (_, i) => `ExponentPushToken[${Math.random().toString(36).substr(2, 15)}]`); // 定义每批次发送的最大数量(符合Expo限制) const MAX_PER_REQUEST = 100; // 拆分令牌为多个批次 const tokenBatches = []; for (let i = 0; i < allPushTokens.length; i += MAX_PER_REQUEST) { tokenBatches.push(allPushTokens.slice(i, i + MAX_PER_REQUEST)); } // 统一的推送内容配置 const notificationContent = { title: '产品更新提醒', body: '我们完成了重要功能更新,立即打开应用查看详情!', data: { updateVersion: 'v2.1.0', updateUrl: '/update' } }; // 批量发送通知的异步函数 async function sendBatchedNotifications() { for (const batch of tokenBatches) { // 过滤掉无效的Expo推送令牌 const validTokens = batch.filter(token => Expo.isExpoPushToken(token)); if (validTokens.length === 0) { console.log('当前批次无有效推送令牌,跳过发送'); continue; } // 构建当前批次的推送消息数组 const pushMessages = validTokens.map(token => ({ to: token, ...notificationContent })); try { // 发送当前批次的通知 const deliveryReceipts = await expo.sendPushNotificationsAsync(pushMessages); console.log(`批次发送完成,回执信息:`, deliveryReceipts); // 可选:处理推送失败的情况,比如记录无效令牌或重试 deliveryReceipts.forEach((receipt, index) => { if (receipt.status === 'error') { console.error(`令牌 ${validTokens[index]} 推送失败,错误信息:`, receipt.message); } }); } catch (error) { console.error(`当前批次发送失败:`, error); } } } // 执行批量发送 sendBatchedNotifications();
关键细节说明
- 令牌验证:使用
Expo.isExpoPushToken过滤无效令牌,避免因无效请求浪费资源或触发额外错误。 - 错误隔离:每个批次的发送单独捕获异常,确保某一批次发送失败不会影响其他批次的执行。
- 回执处理:可以通过返回的回执信息,跟踪推送成功/失败的状态,后续可对失败的推送进行重试或清理无效令牌。
内容的提问来源于stack exchange,提问作者learncode
相关产品推荐
相关产品推荐

