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:
Truy cập Firebase Console.
Vào Project Settings > Service Accounts.
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ụcconfig/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:
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”.
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ặcINVALID_ARGUMENT.So sánh công nghệ: Viết thêm đoạn so sánh giữa việc dùng Gem
fcmvà việc tự viết Wrapper gọiNet::HTTPvớ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_tokencủ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.





