Firebase - Cách sử dụng Realtime Database và Cloud Functions để notification về Client



Nguyễn Anh Vũ / 12-06-2019

I/. Đôi nét về Firebase
Firesbase là giải pháp cơ sở dữ liệu thời gian thực của Google là một cơ sở dữ liệu không cần ngôn ngữ truy vấn riêng. Firebase có thể cung cấp cho bạn tính năng hỗ trợ dữ liệu theo thời gian thực, cung cấp các bản dựng web, android và ios, cung cấp xác thực từ nhiều ứng dụng như google, facebook, twitter, github, v.v…. và cũng có thể lưu trữ hình ảnh, video và âm thanh. Vì vậy, nó rất dễ dàng để lưu trữ và lấy dữ liệu. ngoài ra firebase cũng cung cấp tính năng để lưu trữ các ứng dụng web và di động và rất an toàn. Người dùng không phải lo lắng về phần cứng vì tất cả dữ liệu được lưu trữ trong các máy chủ firebase. Giảm thiểu thời gian xây dựng app,web.

II/. Chuẩn bị kết nối Firebase với app
Đăng nhập acc Goole tại trang chủ của Firebase: https://firebase.google.com/
Có thể tìm hiểu thêm Firebase Doc tại: https://firebase.google.com/docs?authuser=0

+ Bài này mình demo bằng app chat đơn giản trên Android mobile, các bạn có thể tải link đính kèm bên dưới
Link demo: https://drive.google.com/open?id=15fvxP1M1ll6K4nscLRd1MFs5aj34HY9d
Lưu ý chạy trên Android 7.1.1 trở lên

Các library cơ bảng cần có:
1. Authentication
Add Firebase Authentication đến app/build.gradle

implementation 'com.google.firebase:firebase-auth:17.0.0'

2. Realtime Database (demo này dùng Realtime Database)
Add the Realtime Database đến app/build.gradle

implementation 'com.google.firebase:firebase-database:17.0.0'

Để truy vấn vào Realtime Databese ta dùng lệnh sau trong MainActivity

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("table_name");

3. Cloud Function
+ Tại Firebase console, click Add project, điền tên Project name.
+ Tại Firebase console, click Create project để tạo project mới
+ Firebase tự động cung cấp tài nguyên cho dự án Firebase của bạn. Khi quá trình hoàn tất, bạn sẽ được đưa đến bảng điều khiển Firebase.

+ Cài đặt Node.js and the Firebase CLI
Tải và cài đặt Node.js tại https://nodejs.org/en/
Run CMD tại folder của app, và chạy lệnh sau:

npm install -g firebase-tools

Login Firebase CLI (log acc Google)

firebase login

Cài đặt Cloud Function vào app (trong demo này dùng javascript):

firebase init functions

4. Cloud Messaging

+Set up Firebase and the FCM SDK
Thêm the Cloud Messaging đến app/build.gradle

implementation 'com.google.firebase:firebase-messaging:18.0.0'

+Thêm đoạn code sau vào app AndroidManifest.xml

<service
   
android:name=".java.MyFirebaseMessagingService"
   
android:exported="false">
   
<intent-filter>
       
<action android:name="com.google.firebase.MESSAGING_EVENT" />
   
</intent-filter>
</service>

Đối với android 8 trở lên thì thêm đoạn code này trong AndroidManifest.xml

<meta-data
   
android:name="com.google.firebase.messaging.default_notification_channel_id"
   
android:value="@string/default_notification_channel_id" />>

Đến đây chúng ta hoàn thành xong bước chuẩn bị để Firebase và app kết nối với nhau và sử dụng một số dịch vụ của Firebase cho bài demo này.

III/. Chạy app

B1. Realtime Database trên Firebase dùng cho Chat app đơn giản có dạng sau:

  • Database users
    "users" : {
    "LTOx2LsMbmPJYgzI17pp1Gn4GIH2" : {
    "imageURL" : "default",
    "messaging_token" : "dXQYkHeblbM:APA91bGMt0BN9CKViTXRtmu3rMYERW3LGXKLYZsEcUkz...",
    "name" : "Stever",
    "status" : "offline",
    "user_id" : "LTOx2LsMbmPJYgzI17pp1Gn4GIH2"
    },
  • Database Chats
    "Chats" : {
    "-Lh-p-Aw2QE8Mbko7ADc" : {
    "isseen" : true,
    "message" : "hi",
    "receiver" : "RjAx5Q2VOjR8phO6L2QBuLaI1243",
    "sender" : "xHAU6USUzsgGUCmjV9SfEoQl7dj2"
    },

B2: File index.js trong thư mục functions của app như sau file này dùng để điều phối hoạt động của ph:

  • const functions = require('firebase-functions');
    
    const admin = require('firebase-admin');
    
    admin.initializeApp();
    
    exports.sendNotification = functions.database.ref('/Chats/{messageId}').onWrite((change, context) => {
    	
    	//get the userId of the person receiving the notification because we need to get their token
    	const receiverId = change.after.child('receiver').val();
    	console.log("receiverId: ", receiverId);
    	
    	//get the user id of the person who sent the message
    	const senderId = change.after.child('sender').val();
    	console.log("senderId: ", senderId);
    	
    	//get the message
    	const message = change.after.child('message').val();
    	console.log("message: ", message);
    	
    	//get the message id. We'll be sending this in the payload
    	const messageId = context.params.messageId;
    	console.log("messageId: ", messageId);
    	
    	//query the users node and get the name of the user who sent the message
        return admin.database().ref("/users/" + senderId).once('value').then(snap => {
    		const senderName = snap.child("name").val();
    		console.log("senderName: ", senderName);
    		
    		//get the token of the user receiving the message
            return admin.database().ref("/users/" + receiverId).once('value').then(snap => {
    			const token = snap.child("messaging_token").val();
    			console.log("token: ", token);
    			
    			//Build the message payload and send the message
    			console.log("Construction the notification message.");
    			const payload = {
    				data: {
    					data_type: "direct_message",
    					title: "New Message from " + senderName,
    					message: message,
    					message_id: messageId,
    				}
    			};
    			
    			return admin.messaging().sendToDevice(token, payload)
    						.then((response) => {
    							console.log("Successfully sent message:", response);
    						  })
    						  .catch((error) => {
    							console.log("Error sending message:", error);
    						  });
    		});
    	});
    });

    Đây là file js được up lên Cloud Functions Firebase, nó cho phép chạy code backend tự động để phản hồi tới các sự kiện được kích hoạt bởi tính năng của Firebase và HTTPS request (trong demo này thì Realtime Database sẽ nhận data từ Sender và tạo 1 data “Chats” mới). Các Cloud Functions được cách ly hoàn toàn với client, vì vậy bạn có thể chắc chắn rằng nó là riêng tư và luôn thực hiện chính xác những gì bạn muốn. Firebase tự động tăng quy mô tài nguyên máy tính để phù hợp với các patterns sử dụng với người dùng của bạn.

    Các nền tảng firebase được tích hợp:

    Cloud Firestore Triggers
    Realtime Database Triggers
    Firebase Authentication Triggers
    Google Analytics for Firebase Triggers
    Crashlytics Triggers
    Cloud Storage Triggers
    Cloud Pub/Sub Triggers
    HTTP Triggers

    B3: Deploy functions lên Firebase (node.js)

    firebase deploy --only functions

    Sau khi bạn viết và deploy một function, các máy chủ của Google sẽ bắt đầu quản lý function ngay lập tức. Bạn có thể kích hoạt chức năng trực tiếp với HTTP request hoặc với background functions, máy chủ của Google sẽ lắng nghe các sự kiện và chạy chức năng khi nó được kích hoạt.
    Khi lượng load tăng hoặc giảm, Google sẽ nhanh chóng mở rộng số lượng các máy chủ ảo cần thiết để chạy function của bạn. Mỗi function chạy độc lập, trong môi trường riêng với cấu hình riêng của nó.

    B4: Tại Client trên mobile tiến hành đăng kí users và đăng nhập user sau đó gửi message cho nhau.
    Firebase khi nhận được message của Sender lưu trên Realtime Database sẽ gửi thông báo về cho receiverId

    II/. Một vài nhận xét cá nhân về GG Firebase
    Ưu điểm:
    – Lưu trữ JSON (Javascript/Typescript) dùng chung dữ liệu và đối tượng
    – Thiết lập đơn giản
    – Dễ dàng truy cập dữ liệu, tập tin, xác thực and more
    – Không có cơ sở hạ tầng máy chủ cần thiết để cung cấp năng lượng cho ứng dụng với dữ liệu (không cần máy chủ)
    – Tiềm năng kích thước lưu trữ lớn tùy thuộc vào mục đích sử dụng
    – Realtime (vào dashboard hơi lâu chứ data phản hồi giữa các Client là ngay tức thì)
    – Database lưu trữ tiên tiến nhất
    – Bảo mật cao
    – Nghe tên Google nghe là thấy cao cấp!

    Nhược điểm:
    – Firestore được Google thiết kế dành riêng cho doanh nghiệp (mua lại của Cty khác), vẫn còn vài vấn đề về truy vấn và tổng hợp dữ liệu.
    – Chưa được sử dụng rộng rãi cho doanh nghiệp.
    – Dev khó truy cập địa chỉ, thông tin của người dùng và tổng hợp khi có phát sinh sự cố vì ID của mối database được Firebase cấp địa chỉ riêng.


to-top