← 使用情境

把使用者帶回來的推播通知

補貨通知、提醒與回覆,透過一個相容 Beams 的 API 送到 iOS、Android 與網頁,使用者自選訂閱主題,並可直接開啟對應頁面。

你大部分的使用者此刻並不在你的 App 裡。時機恰當的推播通知(「你關注的商品補貨了」、「你的課程 15 分鐘後開始」、「Ann 回覆了你」)會用他們在乎的理由把人帶回來。Hibira Push 透過一個相容 Beams 的 API 發送到 iOS、Android 與瀏覽器,邏輯只要寫一次。

使用者得到什麼

  • 自己選擇關注的事情有通知:降價、支持的隊伍比賽、新的一集。
  • 個人提醒與回覆,送到他們正在用的裝置上。
  • 點一下就打開對應的頁面,而不是首頁。

用到的功能

  • Interest(訂閱主題):裝置訂閱的主題,例如 price-drop-sku-123 或 team-tigers,一次發布就送給所有關注的人。
  • 已驗證的使用者:發布給一個使用者 ID,送到該使用者所有已登入的裝置。
  • 一個請求同時送 APNs、FCM 與 Web Push,搭配網頁、Android 與 iOS SDK。
  • 沿用現有的 Beams 程式碼:官方 Beams 伺服器 SDK 指向你的端點即可使用。

步驟 1:讓使用者選擇要關注什麼

使用者點「通知我」時,讓裝置訂閱一個 interest:

import { Client } from '@hibira-io/push-web';

const push = new Client({ instanceId: 'YOUR_INSTANCE_ID', endpoint: 'https://ws.hibira.io' });

// Browsers only show the permission prompt after a click or tap.
notifyButton.addEventListener('click', async () => {
  await push.start();
  await push.addDeviceInterest(`price-drop-sku-${sku}`);
  notifyButton.textContent = 'We will tell you';
});

Android 與 iOS 也有同樣的 addDeviceInterest;各平台的設定請看推播通知指南。

步驟 2:事情發生時發布

const PushNotifications = require('@pusher/push-notifications-server');
const beams = new PushNotifications({ instanceId: 'YOUR_INSTANCE_ID', secretKey: process.env.HIBIRA_PUSH_SECRET_KEY, endpoint: 'ws.hibira.io' });
beams.protocol = 'https';

await beams.publishToInterests([`price-drop-sku-${sku}`], {
  web: { notification: { title: 'Back in stock', body: `${name} is back, now ${price}.`, deep_link: `https://your-shop.example/p/${sku}` } },
  fcm: { notification: { title: 'Back in stock', body: `${name} is back, now ${price}.` }, data: { url: `/p/${sku}` } },
  apns: { aps: { alert: { title: 'Back in stock', body: `${name} is back, now ${price}.` } }, data: { url: `/p/${sku}` } },
});

一次發布就會送到所有關注這個 interest 的裝置。

步驟 3:給已登入使用者的個人訊息

登入後把裝置連結到你的使用者 ID(SDK 會呼叫你的 token 路由),然後發布給該使用者:

await beams.publishToUsers([String(userId)], {
  fcm: { notification: { title: 'Your class starts in 15 minutes', body: 'Yoga with Mei, studio 2.' } },
  apns: { aps: { alert: { title: 'Your class starts in 15 minutes', body: 'Yoga with Mei, studio 2.' } } },
  web: { notification: { title: 'Your class starts in 15 minutes', deep_link: 'https://your-site.example/bookings' } },
});

使用者登出時,在瀏覽器呼叫 push.stop()(Android 與 iOS 為 clearAllState());使用者刪除帳號時,在伺服器呼叫 beams.deleteUser(userId)。

小提醒

  • 在權限真正有用的時刻才詢問(「補貨時告訴我」),不要在第一次瀏覽頁面時就問;這樣同意的人會多很多。
  • 每件可以關注的事情用一個 interest。Interest 很便宜;使用者沒要求的通知,只會讓你的 App 被設成靜音。
  • 發布之前先在伺服器上依使用者所在時區避開勿擾時段。
  • 推播與即時功能搭配:使用者在 App 裡時,用即時站內通知直接在畫面上顯示同一件事,並略過推播。