Rpush - The push notification service for Ruby

Rpush là một gem được dùng để gửi thông báo từ server cho client trong Ruby. Ngoài những ưu điểm là dễ sử dụng, tính chính xác cao. Rpush còn cũng cấp rất nhiều những tính năng mới mà không có ở những gem khác. Cho phép bạn kiểm soát tốt hơn.

Hỗ trợ nhiều Service

  • Apple Push Notification Service ( Including Safari Push Notifications )
  • Google Cloud Messaging
  • Amazon Device Messaging
  • Windows Phone Push Notification Service

Những tính năng nổi bật

  • Sử dụng ActiveRecord, Redis hoặc MongoDB
  • Có plugin cho Bugsnag, Sentry, StatsD -
  • Làm việc với Works MRI, JRuby và Rubinius
  • Được thiết kế cho thời gian hoạt động - ứng dụng mới được nạp tự động, tín hiệu HUP để cập nhật các ứng dụng đang chạy.
  • Chạy thông qua một hàng đợi hoặc nhúng trong quá trình khác.

Bắt đầu với Rpush

Thêm vào file gem của bạn

gem 'rpush'

Trên command line chạy lệnh

 rpush init

iOS device

Đối với iOs, nếu đây là lần đầu tiên bạn sử dụng APN, bạn cần phải tạo SSL certificates dưới dạng file .pem. Có thể xem hướng dẫn ở đây https://github.com/rpush/rpush/wiki/Generating-Certificates

app = Rpush::Apns::App.new
app.name = "ios_app"
app.certificate = File.read("/path/to/sandbox.pem")
app.environment = "sandbox" # APNs environment.
app.password = "certificate password"
app.connections = 1
app.save!

Code send notification phía server

n = Rpush::Apns::Notification.new
n.app = Rpush::Apns::App.find_by_name("ios_app")
n.device_token = "..." # 64-character hex string
n.alert = "hi mom!"
n.data = { foo: :bar }
n.save!

Chú ý: Các bạn cần kiểm tra device_token phải đúng format. Để tránh xảy ra lỗi trong quá trình send notification.

Android device

Đối với device là android, để push notification. Nó cần một Gcm key được cung cấp bởi Google cloud

app = Rpush::Gcm::App.new
app.name = "android_app"
app.auth_key = "..."
app.connections = 1
app.save!
n = Rpush::Gcm::Notification.new
n.app = Rpush::Gcm::App.find_by_name("android_app")
n.registration_ids = ["..."]
n.data = { message: "hi mom!" }
n.save!

Amazon Device

app = Rpush::Adm::App.new
app.name = "kindle_app"
app.client_id = "..."
app.client_secret = "..."
app.connections = 1
app.save!
n = Rpush::Adm::Notification.new
n.app = Rpush::Adm::App.find_by_name("kindle_app")
n.registration_ids = ["..."]
n.data = { message: "hi mom!"}
n.collapse_key = "Optional consolidationKey"
n.save!

Windows Phone

app = Rpush::Wpns::App.new
app.name = "windows_phone_app"
app.connections = 1
app.save!
n = Rpush::Wpns::Notification.new
n.app = Rpush::Wpns::App.find_by_name("windows_phone_app")
n.uri = "http://..."
n.data = {title:"MyApp", body:"Hello world", param:"user_param1"}
n.save!

Chạy một push notification

$ cd /path/to/project
$ rpush start
rpush push

Vậy là tôi đã giới thiệu cho các bạn cách sử dụng Rpush notification cho các divice như iOS, android hay window phone.

Tuy nhiên, đó chỉ là những cú pháp đơn giản, giúp bạn có thể gửi notification đến một device nhất định nhất định như iOS, Android hay window phone.

Như bạn biết, quá trình gửi một thông báo đến device là như nhau trên mọi nền tảng. Bởi vậy chúng ta nên xây dựng một thư viện cho việc gửi notification. Tôi tạm gọi là notifications_builder

device = # Find your device
app = device.config
alert = 'This is the alert message'
payload = {a: 1, b: 2, c:3}
notification = Rpn::NotificationsBuilder.create_notification! device, alert
# Then, send the notifications
app.send_notifications

Notification gửi đi có dạng như bên dưới

{aps: {
  alert: 'This is the alert message' },
  a: 1,
  b: 2,
  c: 3}

Các issue thường gặp khi gửi notification và cách khắc phục

1. Gửi nhầm notification

Trong thực tế, một vấn đề mà chúng thường gặp khi xây dựng ứng dụng, có bắn notification giữa server và client là việc gửi nhầm notification.

Bản chất của việc gửi notification là dựa vào device token của máy. Khi user đăng nhập trên device khác nhau sẽ mang những device token khác nhau. Và chúng ta chỉ gửi notification khi ứng dụng được đăng nhập bởi user.

Một trường hợp sảy ra, khi user A login vào một device là android. Sau user A đó logout ra, login và sử dụng một device là iOS. Khi chúng ta gửi notification cho tất cả user. Lúc này ở device iOS và device android mà user A vừa sử dụng trước đó đều nhận được Notification.

Điều này là không đúng bởi lẽ user chỉ đang sử dụng app ở trên device là iOS, nên đúng ra chỉ device iOS mới nhận được thông báo còn device Android là không.

Để khắc phục vấn đề này, chúng sẽ sẽ xóa device token của device Android khi user đó logout.

Và cứ như vậy, mỗi khi logout trên một device bất kỳ mà user đó đang sử dụng, chúng ta đều xóa device token của device tương ứng đó.

2 Vấn đề trên những app là iOS

Đây là những issue gặp phải khi sử dụng giao thức APN của Apples khi sử dụng notification.

Không gửi về trạng thái cho các notification được gửi thành công

Những notification bị lỗi trong quá trình gửi sẽ không được xử lý. Và cũng không trả về thông báo lỗi.

Vậy là tôi đã hướng dẫn các bạn cách sử dụng Rpush để send notification cho các ứng dụng app trên mọi nền tảng như iOS, Android. Qua đó đưa ra được những vấn đề phát sinh để các bạn có thể tránh được trong quá trình sử dụng.


All Rights Reserved