前言
相信許多人起床的第一件事就是滑滑手機的通知,看一下有沒有新的 email 或訊息,甚至是購物平台的特價活動等等。最後再決定要不要打開那個應用程式或是一鍵清除。所以如果這項技術不在我們的生活中,那我們的手機將會比宇宙還要安靜。 透過伺服器主動發送訊息到客戶的手機,讓使用者可以及時地獲得各項服務的訊息通知。
Firebase Cloud Messaging 介紹
Firebase Cloud Messaging 簡稱 FCM ,它是一種跨平台的消息傳遞解決方案,可以讓服務免費的發送消息。當然數量也會有一定的限制。所以今天就是要使用 Node.js 來實作 FCM 發送消息的服務。
在 Node.js 中配置 FCM
Step 1 安裝套件
npm install firebase-admin –save
Step 2 在專案中引入該套件
1
| var admin = require('firebase-admin');
|
Step 3 向 FCM 認證
將我們的 FCM 的 service account 與我們的伺服器作認證連結
1 2 3 4
| admin.initializeApp({ credential: admin.credential.applicationDefault(), databaseURL: 'https://<DATABASE_NAME>.firebaseio.com' });
|
傳送推播通知
經過以上的步驟我們的 Node.js 基本上就可以開始推播訊息給我們的用戶,但在這之前請確保手機的 App 已經設置好相關的 FCM sdk ,並將該用戶的 FCM token 傳送到後端並加以儲存。這是為了讓我們伺服器服務知道要推播通知給哪名使用者。
對單一特定的手機裝置傳送 messages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| var registrationToken = 'YOUR_REGISTRATION_TOKEN';
var message = { data: { score: '850', time: '2:45' }, token: registrationToken };
admin.messaging().send(message) .then((response) => { console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
|
對多個手機裝置傳送 messages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
const registrationTokens = [ 'YOUR_REGISTRATION_TOKEN_1', 'YOUR_REGISTRATION_TOKEN_N', ];
const message = { data: {score: '850', time: '2:45'}, tokens: registrationTokens, }
admin.messaging().sendMulticast(message) .then((response) => { console.log(`${response.successCount} messages were sent successfully`); }
|
對已訂閱特定主題 topics 的手機裝置傳送 messages
在建立一個 topic
後,不是透過在手機裝置上訂閱該 topic
就是透過 server API.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| var topic = 'highScores';
var message = { data: { score: '850', time: '2:45' }, topic: topic };
admin.messaging().send(message) .then((response) => { console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
|
當然也有 條件主題 的功能,請查閱 API
批次傳送 messages
可以將最多 100 條訊息組合在一起,然後在 API
呼叫中將他們一次送出去,與每次都為一條訊息發送 HTTP request 的效能上有顯著的提升. e.g.
當你需要同時傳送訊息到不同使用者上,而你主體的訊息內容只有些微的差異。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const messages = []; messages.push({ notification: {title: 'Price drop', body: '5% off all electronics'}, token: registrationToken, }); messages.push({ notification: {title: 'Price drop', body: '2% off all books'}, topic: 'readers-club', });
admin.messaging().sendAll(messages) .then((response) => { console.log(response.successCount + ' messages were sent successfully'); });
|