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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:13:38