[ Firebase ] Hướng dẫn gửi notifications với Cloud Functions
Hướng dẫn chi tiết cách sử dụng Firebase Cloud Functions để tự động gửi thông báo (notifications) khi dữ liệu trong Firebase Realtime Database thay đổi. Bài viết trình bày từng bước cấu hình FCM, lấy device token, viết cloud functions và triển khai hệ thống thông báo hoàn chỉnh cho ứng dụng iOS, giúp lập trình viên xây dựng backend mà không cần quản lý server.
![[ Firebase ] Hướng dẫn gửi notifications với Cloud Functions](/_next/image?url=https%3A%2F%2Fres.cloudinary.com%2Fkhoanguyen1505%2Fimage%2Fupload%2Fv1751210271%2Fkhoa_blog%2F_Firebase_H%25C6%25B0%25E1%25BB%259Bng_d%25E1%25BA%25ABn_g%25E1%25BB%25ADi_notifications_v%25E1%25BB%259Bi_Cloud_Fu%2F4142175b-6bc3-4f0f-89e1-5b081ea1edb4_640x960.png.jpg&w=1920&q=75)
Firebase Cloud Functions là gì
Khoảng 3 tháng trước, Firebase có ra tính năng beta là Cloud Functions rất ảo diệu. Tổng quan là bây giờ bạn có thể build backend hoàn toàn với Firebase được rồi.
Bạn có thể trigger event khi database trên Firebase thay đổi hay gọi HTTPs request, kết nối với Machine Learning API của Google và hàng tá thứ khác. Viết code xong deploy trực tiếp lên Firebase luôn, không phải cài đặt server gì hết, Google đã lo cho bạn từ A-Z. Trước đây chưa có Cloud Functions thì bạn phải viết web server để làm mấy việc này.
Mình đã xài Firebase cho những project trước đây, cảm thấy rất hài lòng và tiện. Và bài này cũng được đúc kết trong quá trình mình cài đặt notifications dùng Cloud Functions và FCM
Ý tưởng:
Trong ứng dụng Elite Condos, mình muốn gửi thông báo đến devices khi trạng thái của đơn hàng thay đổi. Cấu trúc database như sau:
Cấu trúc Order
Kết quả nhận được notifications
Kiến thức cần biết
Mình sẽ lược bỏ những thứ linh tinh chỉ tập trung vào các bước chính, những phần mình chưa giải thích sẽ để lại keywords và link documents để các bạn có thể theo dõi nhé.
Các bước mình đã thực hiện:
-
Gửi notification bằng Firebase Notification Console GUI
-
Gửi notification đến devices nhất định với token ( vẫn dùng Notification Console GUI của Firebase )
-
Gửi notification đến devices nhất định với token bằng cloud functions
-
Tự động lấy token và gửi notification bằng cloud functions
Mình tự nhận là người học chậm nên cái gì cũng phải chia rõ ra mới hiểu và nhớ được.
Nếu bạn không tin thì có thể xem video hướng dẫn của Google, mình xem vài lần mới hiểu được sơ sơ:
Gửi notification bằng Notification Console GUI
Với IOS, bạn cần có APN để gửi notification. Mà để có APN thì bạn cần đăng ký certification và sau đó upload certificate này lên Firebase
Quá trình đăng ký này khá dễ nhưng bạn nêu chú ý từng bước. Đã có bài hướng dẫn rất kĩ trên medium, bạn có thể xem tại đây.
Sau khi export ra file certificate dạng .p12. Bạn vào Project Settings -> CLOUD MESSAGING và upload những certificate này:
Sau đó vào Notification gửi thử vài cái nào:
Gửi notification đến devices nhất định với token
Để gửi notification đến từng device vì ban đầu mình muốn chỉ những khách hàng và nhà cung cấp có order thay đổi nhận notification mà thôi. Đoạn code dưới đây để lấy token và cập nhật lại token lên database
// // AppDelegate.swift // Elite Condos Supplier // // Created by Khoa on 11/1/16. // Copyright © 2016 Khoa. All rights reserved. //
import UIKit import Firebase import FirebaseInstanceID import FirebaseMessaging @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(\_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: \[UIApplicationLaunchOptionsKey: Any\]?) -> Bool {
// Override point for customization after application launch.
FIRApp.configure()
if #available(iOS 8.0, \*) {
let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: \[.alert, .badge, .sound\], categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
} else {
let types: UIRemoteNotificationType = \[.alert, .badge, .sound\]
application.registerForRemoteNotifications(matching: types)
}
NotificationCenter.default.addObserver(self, selector: #selector(self.tokenRefreshNotification(notification:)), name: NSNotification.Name.firInstanceIDTokenRefresh, object: nil)
return true
}
func applicationWillResignActive(\_ application: UIApplication) {
}
func applicationDidEnterBackground(\_ application: UIApplication) {
}
func applicationWillEnterForeground(\_ application: UIApplication) {
}
func applicationDidBecomeActive(\_ application: UIApplication) {
UIApplication.shared.applicationIconBadgeNumber = 0
connectToFCM()
}
func applicationWillTerminate(\_ application: UIApplication) {
}
func tokenRefreshNotification(notification: NSNotification) {
if let token = FIRInstanceID.instanceID().token(){
Api.User.updateTokenToDatabase(token: token, onSuccess: {
UserDefaults.standard.setValue(token, forKey: "token")
print("token in didRegister: \\(token)")
self.connectToFCM()
})
}
}
func application(\_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
if let token = FIRInstanceID.instanceID().token(){
Api.User.updateTokenToDatabase(token: token, onSuccess: {
UserDefaults.standard.setValue(token, forKey: "token")
print("token in didRegister: \\(token)")
self.connectToFCM()
})
}
}
func connectToFCM() {
FIRMessaging.messaging().connect { (error) in
if (error != nil) {
print("Unable to connect to FCM \\(error.debugDescription)")
} else {
print("Connected to FCM")
}
}
}
}
Lúc này, trên database đã lưu lại token của device, tùy theo database của bạn mà bạn lưu token cho phù hợp nhé, thường lưu ở trong user là ổn nhất.
Nhớ lưu token nhé
Khi đó bạn vào lại Notification Console để gửi đến device có token này test thử xem sao?
Trong mục Target , bạn chọn Single device để test tính năng này:
Như vậy là đã xong việc gửi notification đến 1 device nhất định.
Tự động gửi đến devices bằng Cloud Functions
Mình sẽ bỏ qua bước "Gửi notification đến devices nhất định với token bằng cloud function" luôn nhé. Lúc mình học thì cần bước này để hiểu, còn khi hướng dẫn không thấy bước này cần thiết lắm.
Cloud Functions viết như NodeJS vậy :)). Lời khuyên tốt nhất là nên đọc sơ qua Javascript, npm, NodeJs trước. Sau đó vào Git repos của Cloud Functions và đọc code mẫu để biết cách init project, kết nối với project trên Firebase, cách deploy thế nào.
Link github: https://github.com/firebase/functions-samples
Mình khuyến khích bạn nên xem 2 project mẫu là:
Text Moderation: Tự động thay đổi text bậy bạ, ví dụ user gửi lên database "fuck you. You're son of the bitch" thì function này sẽ đổi thành "**** you.You're son of the ***** ". Ví dụ này, bạn sẽ thấy việc sử dụng được nhữ thư viện của npm như ' bad-words' hiệu quả thế nào.
Send FCM notifications: Gửi notification nhưng trên nền website. Xem xong bạn sẽ hiểu phần nào cách cloud functions hoạt động
Và đây là function gửi notification khi order.status thay đổi. Vì mình phân user thành supplier và customer nên token được lưu ở 2 nơi.
Workflow của đoạn code này như sau:
-
Xem order nào có giá trị thay đổi
-
Lấy customerId và supplierId. Dựa vào đó lấy token của từng device
-
Tạo payload để gửi notifications.
'use strict';
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase);
// Moderates messages by lowering all uppercase messages and removing swearwords. exports.sendNotifications = functions.database .ref('/orders/{orderId}').onWrite(event => { const order = event.data.val();
const orderId = event.params.orderId
var statusName = "NOTACCEPTED";
switch (order.status) {
case 0:
statusName = "NOTACCEPTED"
break;
case 1:
statusName = "ONGOING"
break;
case 2:
statusName = "CANCEL"
break;
case 3:
statusName = "FINISHED"
break;
default:
statusName = "REJECTED"
break;
}
console.log('Current status: ', order.status);
console.log('customer id', order.customerId);
console.log('supplier id', order.supplierId);
const customerRef = admin.database().ref(\`/customers/${order.customerId}\`).once('value');
const supplierRef = admin.database().ref(\`/suppliers/${order.supplierId}\`).once('value');
return Promise.all(\[customerRef, supplierRef\]).then(result => {
const customer = result\[0\].val()
const supplier = result\[1\].val()
if (customer.token != null && supplier.token != null) {
console.log('customer Token = ', customer.token);
console.log('supplier Token = ', supplier.token);
const payload = {
notification: {
title: \`Elite Condos Notifications\`,
body: \`Đơn hàng #${orderId} đã thay đổi trạng thái: ${statusName}\`,
sound: "default",
badge: "1"
}
};
var tokens = \[customer.token, supplier.token\];
console.log(' Tokens array = ', tokens);
return admin.messaging().sendToDevice(tokens, payload).then(response => {
console.log('response', response)
})
}
})
});
Ngoài ra, nếu bạn mới biết Javascript thì nên tìm hiểu Promise trong Javascript là hiểu được đoạn code trên dễ dàng rồi.
Sau đó bạn deploy lên firebase là xong.
Tổng kết
Bài viết theo phương châm là cho cần câu chứ không cho cá. Mình không hướng dẫn, giải thích chi tiết từng bước. Tại vì nó quá nhiều, thứ hai nữa là bạn cần đọc document thêm để hiểu rõ.
Hy vọng bài viết đã giúp các bạn phần nào về việc gửi notification với Cloud Functions. Mọi ý kiến đóng góp cứ comment nhé.
À, theo mình dự đoán thì tương lai Firebase sẽ rất báo đạo, đương nhiên sẽ có nhiều bài viết mới về Firebase trong tương lai. Hẹn gặp lại.
Related Posts
Discover more content you might enjoy

Game Theory trong thời đại AI: Khi máy móc tham gia vào "trò chơi"
Bài viết phân tích sự giao thoa giữa lý thuyết trò chơi (Game Theory) và trí tuệ nhân tạo, giải thích cách AI đang thay đổi các nguyên lý cân bằng Nash và chiến lược tối ưu. Tác giả đưa ra các ví dụ thực tế về ứng dụng trong kinh doanh, giao thông và an ninh mạng.

Bài này không phải AI viết
Suy ngẫm chân thành về giá trị của việc viết thủ công trong kỷ nguyên AI. Dù AI có thể tạo nội dung hiệu quả, bài viết này là lời khẳng định về sự kết nối cá nhân và giá trị độc đáo mà con người mang lại cho văn bản của mình.

Dự đoán về Vibe Coding: Cách AI sẽ biến đổi việc tạo ra phần mềm
Bài viết phân tích cách 'vibe coding' - phương pháp lập trình dựa trên mô tả ý định thay vì viết code trực tiếp - sẽ dân chủ hóa việc phát triển phần mềm. Tác giả dự đoán về sự chuyển đổi từ giao diện dòng lệnh sang thiết kế trực quan, sự xuất hiện của phần mềm tự cải thiện, và tác động đến cấu trúc tổ chức công ty cũng như các thị trường ngách chưa được khai thác.

Dùng AI để hỗ trợ đầu tư crypto
Bài viết chia sẻ 7 mẹo thực tế để sử dụng AI (như Claude.ai và ChatGPT) hỗ trợ hiểu rõ whitepaper và tài liệu kỹ thuật của các dự án blockchain. Từ việc yêu cầu tóm tắt đơn giản, giải thích như cho trẻ em, đặt câu hỏi làm rõ, sử dụng ví dụ, tạo tình huống giả định, chuyển đổi thuật ngữ, đến so sánh nhiều nguồn tài liệu - giúp nhà đầu tư đưa ra quyết định đầu tư crypto sáng suốt hơn.

10 năm đọc sách - hành trình trưởng thành
Bài viết chia sẻ hành trình đọc sách 10 năm của tác giả, từ sinh viên năm nhất đến bộ sưu tập 265 cuốn sách hiện tại. Tác giả phản ánh về cách mỗi cuốn sách đã định hình tư duy và góp phần xây dựng con người mình, từ văn học Việt Nam và thế giới đến sách về phát triển cá nhân, kinh doanh và triết học. Đây là câu chuyện về sự trưởng thành thông qua việc đọc sách và những bài học quý giá thu được trong suốt hành trình.
