0%

推播通知 Push Notification - 改變手機應用的技術

前言

相信許多人起床的第一件事就是滑滑手機的通知,看一下有沒有新的 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
// 這個註冊的 token 是從手機端的 FCM SDKs 傳來的.
var registrationToken = 'YOUR_REGISTRATION_TOKEN';

var message = {
data: {
score: '850',
time: '2:45'
},
token: registrationToken
};

// 對這個已註冊 token 的手機裝置傳送訊息
admin.messaging().send(message)
.then((response) => {
// Response 是一個字串型別的 message ID.
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
// 可以建立包含多達 100 個已註冊 token 的陣列(串列).
// 這些已註冊的 tokens 手機端的 FCM SDKs.
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
// 可以在 topic 名字前面選擇性地加上 "/topics/".
var topic = 'highScores';

var message = {
data: {
score: '850',
time: '2:45'
},
topic: topic
};

// 向已經訂閱該 topic 的手機裝置傳送訊息.
admin.messaging().send(message)
.then((response) => {
// Response 是一個字串型別的 message ID.
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
// 建立一個最多包涵 100 條訊息的陣列(串列)。
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');
});