How to use firebase to push notification from server to device

1. Giới thiệu

Trong một project làm việc với mobile app sẽ xuất hiện trường hợp server sẽ gửi notification cho mobile app . Bài viết này tôi sẽ hướng dẫn các bạn sử dụng firebase để push notification từ server đến mobile app.

2. Bắt đầu

1. Setup

Đầu tiên các bạn cần cần tạo một project trên firebase tại đây https://console.firebase.google.com/u/0/project/_/settings/serviceaccounts/adminsdk

Ở đây tôi tạo một project có tên là Demo:

Tiếp theo bạn cần thực hiện Add Firebase to đến app Đối với android(Bên IOS làm tương tự) bạn ấn vào biểu tượng android trên màn hình trên thực hiện register app firebase sẽ cho bạn file google-services.json để bạn thực hiện việc này(việc này do bên app thực hiện nên tôi sẽ không trình bày trong bài viết này) Sau khi register thành công bạn sẽ nhìn thấy màn hình này Oke vậy là xong phần setup cho project và register app đến server firebase

2. Push Notification cho từng device

Firebase suport api cho phép bạn push notification cho từng device :

curl -X POST \
  https://fcm.googleapis.com/fcm/send \
  -H 'Authorization: key=AAAAh4jA-Bc:APA91bEp00Mn6rurCbkpT3kgF-tbDR22JjBOwIua1jfX4J7fFiOZbxxNtBV8kvXXMJEklTrgVgokGLkeQkzJE3Q-j9S_m8s8fLEJjA9ruQO3N8rkSwGtJvn9kyUJ1-wtJ6nTN4wM7vPh' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: 00be4836-342a-4f12-b551-cc499187bf19' \
  -d '{
"to" : "dV2vF_5LBRE:APA91bFEFX27zM-8UmxFbwZ_K3Jyd4MXwGcz-t2XB6h0t-bPA1UoZMxPMpQAMYIdzUbyFC5KiBTf7xGxRkj-hI7TSDSCGbrgqPHhaJKHUZZGtiwH3wUbW1D7jTp353UXTcdp-VKpR4ZN",
"priority": "high",
"notification":{
	"title":"hello"
},
"data": {
"title": "Firebase Notification Example",
"detail": "This firebase push notification will be sent to all firebase tokens (devices) registered with your app server."
}
}'

"Authorization" : Đây là chuỗi server key bạn có thể lấy nó ở settings -> clound messaging như hình dưới đây "to" : Đây là chuỗi token của device, server firebase sẽ dùng nó để xác định việc push notification cho device nào

Các thông tin còn lại trong body rất dễ hiểu nên mình không giải thích.

3. Push Notification cho nhiều device

Cách thứ nhất send một list device token bằng api :

curl -X POST \
  https://fcm.googleapis.com/fcm/send \
  -H 'Authorization: key=AAAAh4jA-Bc:APA91bEp00Mn6rurCbkpT3kgF-tbDR22JjBOwIua1jfX4J7fFiOZbxxNtBV8kvXXMJEklTrgVgokGLkeQkzJE3Q-j9S_m8s8fLEJjA9ruQO3N8rkSwGtJvn9kyUJ1-wtJ6nTN4wM7vPh' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: 37c7ce0c-a14b-4265-b5fd-da93ba152d15' \
  -d '{
"registration_ids": [
"dPI0OjUHL68:APA91bGf1FPEUhvvhRccJ3Va32kAng5L_qqJQoIy8Og2LkDcZJeFJgY63p5odXKnvTBYrak5tmaJKqbSe-XEzG5BzkwL_NoEa4NooRxoBZewzAS7USPHQJ_HoN_wKeDewSdddWkIRnD2",
                "dV2vF_5LBRE:APA91bFEFX27zM-8UmxFbwZ_K3Jyd4MXwGcz-t2XB6h0t-bPA1UoZMxPMpQAMYIdzUbyFC5KiBTf7xGxRkj-hI7TSDSCGbrgqPHhaJKHUZZGtiwH3wUbW1D7jTp353UXTcdp-VKpR4ZN"
],
"priority": "high",
"notification":{
	"title":"hello"
},
"data": {
"title": "Firebase Notification Example",
"detail": "This firebase push notification will be sent to all firebase tokens (devices) registered with your app server."
}
}'

Ở đây chỉ khác với push notification cho từng device đó là body thay thế to -> registration_ids : trong đó truyền vào list device token bạn cần push notification

Sử dụng cách này thì rất đơn giản nhưng không tốt nếu bạn muốn push notification cho số lượng lớn device nên ta sẽ chuyển cho sang cách hai nhé

Cách thứ hai sử dụng topic của firebase:

Chúng ta sẽ push notification đến một topic và những device đã subscribe topic đó sẽ nhận được notification.

Bước 1 : bạn cần một file service accounts và database Url

Bạn vào settings -> service accounts sau đó chọn ngôn ngữ thích hợp ,tôi chon java sau đó ấn Generate new private key -> bạn được dowload file .json bạn có thể đổi tên tùy ý ở đây tôi đặt tên là service-accounts.json

Database Url thì bạn có thể hình thấy ở ảnh bên dưới là :https://fir-201ad.firebaseio.com

Bước 2: Thực hiện code service subscribeToTopic và unsubscribeToTopic bạn cần thêm thư viện:

<dependency>
            <groupId>com.google.firebase</groupId>
            <artifactId>firebase-admin</artifactId>
            <version>6.8.1</version>
        </dependency>
package com.ssk.sskbe.pns.ex;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.messaging.FirebaseMessaging;
import com.google.firebase.messaging.FirebaseMessagingException;
import com.google.firebase.messaging.TopicManagementResponse;
import org.springframework.util.ResourceUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

public class PnsHelper {
    private static PnsHelper sInstance;

    private FirebaseApp firebaseApp;

    private PnsHelper(String accountServiceJsonPath, String databaseUrl) {
        firebaseApp = createFirebaseApp(accountServiceJsonPath, databaseUrl);
    }

    public static PnsHelper getsInstance(String accountServiceJsonPath, String databaseUrl) {
        if (sInstance == null) {
            sInstance = new PnsHelper(accountServiceJsonPath, databaseUrl);
        }
        return sInstance;
    }

    public static FirebaseApp createFirebaseApp(String accountServiceJsonPath, String databaseUrl) {

        FirebaseApp firebaseApp = null;

        try {
            FileInputStream serviceAccount = new FileInputStream(ResourceUtils.getFile(accountServiceJsonPath));
            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .setDatabaseUrl(databaseUrl)
                    .build();

            if (FirebaseApp.getApps().isEmpty()) {
                firebaseApp = FirebaseApp.initializeApp(options);
            } else {
                firebaseApp = FirebaseApp.getInstance();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return firebaseApp;
    }

    public TopicManagementResponse subscribeToTopic(List<String> subscribeTokens, String topicName) throws FirebaseMessagingException {
        return FirebaseMessaging.getInstance(firebaseApp).subscribeToTopic(
                subscribeTokens, topicName);
    }

    public TopicManagementResponse unsubscribeToTopic(List<String> unsubscribeTokens, String topicName) throws FirebaseMessagingException {
        return FirebaseMessaging.getInstance(firebaseApp).unsubscribeFromTopic(
                unsubscribeTokens, topicName);
    }
}

Đối với phương thứcsubscribeToTopic(List<String> subscribeTokens, String topicName)

subscribeTokens : là những list device token mà bạn muốn subscribe

topicName là tên topic bạn muốn subscribe

Mặc định khi bạn truyền vào một topicName không tồn tại thì firebase sẽ tự động tạo

Oke vậy là xong bây giờ đến bước push nofication đến topic

curl -X POST \
  https://fcm.googleapis.com/fcm/send \
  -H 'Authorization: key=AAAAh4jA-Bc:APA91bEp00Mn6rurCbkpT3kgF-tbDR22JjBOwIua1jfX4J7fFiOZbxxNtBV8kvXXMJEklTrgVgokGLkeQkzJE3Q-j9S_m8s8fLEJjA9ruQO3N8rkSwGtJvn9kyUJ1-wtJ6nTN4wM7vPh' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: 4623bb79-fbc4-429d-9ec0-41558b76de32' \
  -d '{
"to": "/topics/test",
"priority": "high",
"notification":{
	"title":"hahahahahahahahahah"
},
"data": {
"title": "Firebase Notification Example",
"detail": "This firebase push notification will be sent to all firebase tokens (devices) registered with your app server."
}
}'

Bạn có thể thấy chúng ta đang push notification đến topic có tên là test ("to": "/topics/test") tất cả những device đã subscribe topic có tên device sẽ nhận được notification

Bạn có thể unsubscribe các device token của bạn muốn tôi đã viết method đó ở trên bạn có thể xem

4.Kết

Qua bài viết này hi vọng mọi người sẽ biết cách làm thế nào để push notification đến device sử dụng firebase

Cảm ơn các bạn đã qđọc bài viết và hẹn gặp lại ở những bài viết tiếp theo !