我可以将 OneSignal 代币导入 FCM 吗?

Can I import OneSignal tokens to FCM?

我有几千个 OneSignal web push 通知令牌我想导入到 FCM。有办法吗?

我看到这个端点需要 OneSignal 给我的 https://fcm.googleapis.com/fcm/send/...key... 端点,但我不知道要为 authp256dh.[=14= 输入什么]

https://developers.google.com/instance-id/reference/server#create_registration_tokens_for_apns_tokens

所以是的,这是可以做到的。首先,您需要联系 OneSignal 支持并为您的应用获取 public 和私人 VAPID 密钥。您仪表板中的每个应用都有不同的集合。

接下来您需要 API 调用 OneSignal 以便将用户导出到 CSV 文件中。

您可以在文档中找到 API url 并使用 curl 或使用您喜欢的语言。我使用 Node + Axios 来打电话。 API 调用将为您提供 link 以下载 CSV。

这是文档https://documentation.onesignal.com/reference#csv-export

您要确保将 "extra_fields" 参数添加到您的请求中,并添加了 "web_auth" 和 "web_p256" 字段。 CSV 将为您提供另一块拼图,即标识符列中的端点 url。

获得所有这些信息后,您现在可以使用 Node 的 web-push 等库发送推送

https://github.com/web-push-libs/web-push

希望对您有所帮助!

编辑

正如 Cedric 所说,实际的推送负载稍微复杂一些,因为您需要遵守 OneSignal Service worker 数据处理。

您可以看到格式从第 313 行开始 here

如果您使用像 web-push 这样的库来让 Node 发送您的推送有效负载,您的有效负载将被格式化为这样的格式,以便向 OneSignal 服务工作者进行标准推送。

const uuidv1 = require('uuid/v1')
const webpush = require('web-push') 

let subscription = {
    endpoint: 'USER ENDPOINT URL',
    keys: {
        auth: 'USER AUTH KEY',
        p256dh: 'USER P256 KEY'
    }
}

let vapid = { private: 'VAPID PRIVATE KEY', public: 'VAPID PUBLIC KEY' }

// Format Message for OneSignal Service Worker
let notification = JSON.stringify({
    custom: {
        i: uuidv1(), //Generate UUID for the OneSignal Service worker to consume
        u: 'CLICK URL'
    },
    title: 'TOP TITLE',
    alert: 'MESSAGE BODY',
    icon: 'ICON IMAGE URL'
})

webpush.setVapidDetails('mailto: sendError@YourEmail.com', vapid.public, vapid.private)
webpush.sendNotification(subscription, notification)

这比 Dan 的回答复杂得多。如果您的用户不订阅您自己的 service worker,它将无法工作。 OS 将在发生 'unknown' 错误时发送其默认通知,即使您传递了不同的负载,它也会将 "You have new updates" 作为通知发送给用户。您还需要将:"custom": { "i": uuidv1() } 传递给您的有效负载才能使其正常工作。 (不要忘记先通过 npm 安装 uuid 并调用它)。查看 this link,您将了解还需要传递哪些有效负载道具。