如何通过REST API遍历对象数组逐个发送OneSignal推送通知?
用OneSignal REST API遍历设备ID发送个性化推送的实现方案
完全可行!遍历每个playerid调用OneSignal的REST API就是最直接的解决方案,尤其适合你这种需要结合userinfo发送个性化推送的场景。下面给你详细拆解具体实现步骤:
一、核心逻辑确认
OneSignal的REST API本身支持针对单个或多个playerid发送通知,逐个调用的方式既能满足你“逐个发送”的需求,还能方便地利用userinfo里的信息定制每个用户的推送内容,非常灵活。
二、具体实现步骤
1. 准备必要的认证信息
首先得从OneSignal后台拿到两个关键参数:
APP_ID:你的OneSignal应用专属ID,在应用设置页面可以找到REST_API_KEY:你的API密钥,在应用的API设置栏获取(注意:这个密钥要保密,绝对不能暴露在前端代码里)
2. 遍历用户数组,逐个调用API
假设你的用户数据结构是这样的:
const userList = [ { playerid: "abc123-def456-ghi789-jkl012", userinfo: { nickname: "小A", reminder: "你的订单即将发货" } }, { playerid: "mno345-pqr678-stu901-vwx234", userinfo: { nickname: "小B", reminder: "你有一条新私信" } } ];
下面以Node.js为例,用axios库写一个可运行的示例(你也可以用其他HTTP客户端,比如原生fetch、Python的requests等):
首先安装依赖(如果用Node.js的话):
npm install axios
然后编写发送逻辑:
const axios = require('axios'); // 配置OneSignal API信息 const ONE_SIGNAL_ENDPOINT = "https://onesignal.com/api/v1/notifications"; const APP_ID = "你的应用ID"; const REST_API_KEY = "你的REST API密钥"; // 单个用户推送函数 async function sendSingleNotification(user) { try { const response = await axios.post(ONE_SIGNAL_ENDPOINT, { app_id: APP_ID, include_player_ids: [user.playerid], // 单个playerid放入数组 // 利用userinfo定制个性化内容 contents: { "en": `${user.userinfo.nickname},${user.userinfo.reminder}` }, // 可选:添加标题、自定义数据等配置 headings: { "en": "专属提醒" }, data: { user_data: user.userinfo } }, { headers: { "Authorization": `Basic ${REST_API_KEY}`, "Content-Type": "application/json" } }); console.log(`✅ 成功给${user.playerid}发送通知,推送ID:${response.data.id}`); } catch (error) { console.error(`❌ 给${user.playerid}发送通知失败:`, error.response?.data || error.message); // 可以在这里记录失败的用户,后续重试 } } // 遍历所有用户发送 async function sendAllNotifications() { const userList = [/* 你的用户数组 */]; for (const user of userList) { await sendSingleNotification(user); // 可选:添加短延迟,避免触发OneSignal的API频率限制 await new Promise(resolve => setTimeout(resolve, 100)); } } // 执行推送 sendAllNotifications();
3. 关键注意事项
- API频率限制:OneSignal对API调用有频率限制,如果你的用户量很大(比如上万级),一定要添加适当的延迟,或者分批次处理,避免被限流
- 错误重试机制:务必做好异常捕获,把推送失败的
playerid记录下来,后续可以重新尝试发送 - 个性化内容适配:如果需要多语言推送,可以在
contents里添加对应语言的键值对(比如"zh": "中文内容") - 后端执行:这个逻辑必须放在后端运行,绝对不能在前端执行,否则会泄露你的
REST_API_KEY
三、可选替代方案(批量发送)
如果你的推送内容不需要个性化,只是给所有用户发相同消息,可以一次性把所有playerid放入include_player_ids数组(最多支持2000个playerid per请求),这样能减少API调用次数:
async function sendBulkNotification() { const allPlayerIds = userList.map(user => user.playerid); try { const response = await axios.post(ONE_SIGNAL_ENDPOINT, { app_id: APP_ID, include_player_ids: allPlayerIds, contents: { "en": "全体通知:系统即将维护,请留意" } }, { headers: { "Authorization": `Basic ${REST_API_KEY}`, "Content-Type": "application/json" } }); console.log("批量推送成功,推送ID:", response.data.id); } catch (error) { console.error("批量推送失败:", error.response?.data || error.message); } }
但如果需要给每个用户发送不同内容,还是遍历逐个发送的方式更合适。
内容的提问来源于stack exchange,提问作者U rock
相关产品推荐
相关产品推荐

