Blog Single

Ruby: Hướng Dẫn Push Notification Đến Android & iOS Qua FCM (Firebase Cloud Messaging)

Việc gửi thông báo đẩy (Push Notifications) là tính năng sống còn để giữ chân người dùng (user retention). Trong hệ sinh thái Ruby, chúng ta thường sử dụng các Gem mạnh mẽ để tương tác với Firebase Cloud Messaging (FCM) HTTP v1 API — giao thức bảo mật và hiện đại nhất hiện nay của Google.

1. Tại sao nên sử dụng FCM HTTP v1 thay vì Legacy API?

Trước khi đi vào code, bạn cần hiểu rằng Google đã ngừng hỗ trợ giao thức cũ (Legacy). Giao thức HTTP v1 mang lại:

  • Bảo mật cao hơn: Sử dụng OAuth2 thay vì Server Key tĩnh.

  • Tùy biến đa nền tảng: Dễ dàng cấu hình riêng biệt cho Android (JSON) và iOS (APNs) trong cùng một request.


2. Chuẩn bị trên Firebase Console

Để Ruby có thể gửi tin nhắn, bạn cần lấy file cấu hình:

  1. Truy cập Firebase Console.

  2. Vào Project Settings > Service Accounts.

  3. Nhấn Generate New Private Key. Bạn sẽ nhận được một file .json. Hãy lưu nó vào thư mục config/ của dự án Ruby (ví dụ: firebase-service-account.json).


3. Cài đặt Gem cần thiết

Thay vì sử dụng các Gem cũ không còn bảo trì, hãy sử dụng fcm (phiên bản mới nhất hỗ trợ v1) hoặc trực tiếp sử dụng google-auth để gọi API.

Thêm vào Gemfile:

Ruby

gem 'fcm'
# Hoặc sử dụng gem chuyên biệt cho Google Auth
gem 'googleauth'

Sau đó chạy bundle install.


4. Triển khai Code gửi Notification trong Ruby

Dưới đây là Service Object chuẩn để bạn có thể tái sử dụng trong Rails hoặc bất kỳ script Ruby nào.

Ruby

require 'fcm'

class PushNotificationService
  FCM_PROJECT_ID = 'your-project-id-123' # Lấy từ file JSON
  KEY_FILE_PATH = Rails.root.join('config', 'firebase-service-account.json')

  def self.send_to_device(token, title, body, data = {})
    fcm = FCM.new(nil, KEY_FILE_PATH, FCM_PROJECT_ID)

    message = {
      'message' => {
        'token' => token,
        'notification' => {
          'title' => title,
          'body' => body
        },
        'data' => data, # Dữ liệu bổ sung để xử lý khi click vào app
        'android' => {
          'priority' => 'high',
          'notification' => { 'sound' => 'default' }
        },
        'apns' => {
          'payload' => {
            'aps' => { 'sound' => 'default', 'badge' => 1 }
          }
        }
      }
    }

    response = fcm.send_v1(message)
    handle_response(response)
  end

  private

  def self.handle_response(response)
    if response[:status_code] == 200
      puts "Gửi thông báo thành công!"
    else
      puts "Lỗi: #{response[:response]}"
    end
  end
end

5. Cách tối ưu SEO cho bài viết này (Tránh lỗi trùng lặp)

Để bài viết của bạn không bị Google đánh giá là “copy-paste”, hãy thực hiện 3 mẹo sau:

  1. Cung cấp Case Study cụ thể: Thay vì chỉ viết “Cách gửi”, hãy viết về “Cách gửi thông báo đơn hàng cho ứng dụng E-commerce bằng Ruby”.

  2. Xử lý lỗi thực tế: Thêm mục giải quyết các lỗi phổ biến như UNREGISTERED_TOKEN (khi user gỡ app) hoặc INVALID_ARGUMENT.

  3. So sánh công nghệ: Viết thêm đoạn so sánh giữa việc dùng Gem fcm và việc tự viết Wrapper gọi Net::HTTP với Google Auth.

6. Các lỗi thường gặp và cách xử lý

  • Lỗi 401 Unauthorized: Thường do file JSON bị sai đường dẫn hoặc quyền (IAM roles) trong Google Cloud chưa đủ.

  • Thiếu quyền APNs cho iOS: Đảm bảo bạn đã upload file .p8 (Auth Key) lên Firebase Console, nếu không iOS sẽ không nhận được thông báo dù Ruby báo thành công.


Kết luận

Sử dụng Ruby để đẩy notification qua FCM không khó, nhưng để làm đúng chuẩn HTTP v1 và đảm bảo hiệu năng thì bạn nên sử dụng Sidekiq để thực hiện tác vụ này dưới background.

Mẹo nâng cao: Luôn lưu trữ fcm_token của người dùng trong database và cập nhật lại mỗi khi họ login để tránh gửi vào các token cũ đã hết hạn.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *