Sử dụng Firebase Cloud Messaging(fcm) để push notification từ API Rails đến thiết bị Android

1. Giới thiệu

Tại sự kiện Google I/O tổ chức tháng 5 năm 2016. Google giới thiệu Firebase – một nền tảng đám mây với rất nhiều tính năng nổi bật cho các lập trình viên Mobile như: Firebase Analytics, Firebase Cloud Messaging, Firebase Auth, Realtime Database, Firebase Storage…

Trong đó Firebase Cloud Messaging (FCM) là một dịch vụ miễn phí của Google. Thông qua FCM, nhà phát triển ứng dụng có thể gửi thông điệp một cách nhanh chóng, an toàn tới các thiết bị cài đặt ứng dụng của họ.

Trong bài viết này mình sẽ giúp các bạn hiểu và cài đặt FCM trên server API Rails để gửi Notification đến các thiết bị Android.

2. Firebase push notification hoạt động như thế nào?

Mô hình hoạt động của FCM. Đơn giản FCM hoạt động nhờ 3 thành phần

  • Publisher: Nguồn gửi notification, đây chính là server API mà cúng ta sẽ cài đặt
  • FCM Server: Đây là API trung gian giữa Publisher và Client App có nhiệm vụ tiếp nhận Notification từ Publisher và push Notification tới client. Ngoài ra nó cũng tiếp nhận message đăng kí device token từ client.
  • Client app: Thiết bị nhận notification, cự thể ở đây là các thiết bị Android

3. Xây dựng server Rails với gem "fcm"

  • Cài đặt gem "fcm"
Gemfile
gem "fcm"

thêm gem "fcm" và chạy bundle

  • Tạo model Notification để lưu trữ notification
Terminal
rails g model notification sender_id: integer, receiver_id: integer, content: string

chạy rails db:migrate và định nghĩa association trog model

user.rb
has_many :notification, class_name: Notification.name, foreign_key: "sender_id", dependent: :destroy
has_many :notified, class_name: Notification.name, foreign_key: "receiver_id", dependent: :destroy
notification.rb
belongs_to :sender, class_name: User.name, foreign_key: "sender_id", dependent: :destroy
belongs_to :receiver, class_name: Usere.name, foreign_key: "receiver_id", dependent: :destroy

Vì notification thường là thông báo về hoạt động giữa hai user nên chúng ta cần định nghĩa các association để tiện cho việc viết code và query dữ liệu sau này.

  • Tạo service gửi notification Ở đây, tôi sẽ tạo một service có tên SendNotificationService để có thể gọi được ở nhiều controller khác nhau
notification/send_notification_service.rb
class Notification::SendNotificationService
  attr_reader :notification, :device_tokens
  require "fcm"
  
  def initialize notification, device_tokens
    @notification = notification
    @device_tokens = device_tokens
  end
end

Chú ý: bạn phải require "fcm" để include module của gem "fcm" thì mới có thể thực hiện được push notification. Ngoài ra, để gửi được notification đến đúng thiết bị cần gửi thì bạn cần phải có device_token, device_token này unique, mỗi thiết bị chỉ có một token và không trùng nhau. Bạn có thể request Client App gửi lên mỗi khi đăng nhập và lưu vào Database. Trong trường hợp một user đăng nhập nhiều thiết bị và có nhiều device_tokens thì bạn chỉ cần truyền 1 Array các token.

notification/send_notification_service.rb
def perform
    fcm = FCM.new ENV["FCM_SERVER_KEY"]
    options = {
      data: {
        content: notification.content,
        sender_id: notification.sender_id
      }
    }
    fcm.send(device_tokens, options)
  end

Ở đây biến môi trường ENV["FCM_SERVER_KEY"] chính là api_key của FCM, Bạn sẽ có được api_key này sau khi tạo một project trên trang chủ của FCM: https://firebase.google.com/docs/cloud-messaging/. Ngoài ra bạn có thể custome biến options sao cho phù hợp với yêu cầu sản phẩm của mình, miễn là biến options có kiểu là hash. Như vậy, với sự hỗ trợ của gem "fcm" việc push notification từ server-API là rất đơn giản. Nhưng bạn cần chú ý ở khâu thiết kế DB để có thể đáp ứng được tất cả yêu cầu sản phầm, vì notification thường được dùng ở nhiều model và hoàn cảnh khác nhau. Cảm ơn các bạn đã theo dõi bài viết của mình.