Thử nghiệm push notification với AWS SDK và Ruby
Bài đăng này đã không được cập nhật trong 8 năm
Sử dụng dịch vụ SNS của Amazon Web Service (AWS) để phục vụ cho các tính năng liên quan tới push thì không còn quá xa lạ với mọi người, bài viết này mình sẽ sử dụng Ruby và AWS SDK để tạo base, phục vụ cho việc push notification tới client.
Yêu cầu :
- Ruby phiên bản nào cũng được
- Gem
aws-sdk
- Client : iPhone hoặc máy Android nào đó còn dùng được.
Về công việc bên trang AWS SNS, bạn hãy tạo một Application và chọn đối tượng muốn push, ở đây mình test với Apple Push Notification Service
Sau khi tạo xong, bạn sẽ nhận được một chuỗi text, hãy giữ lại để dùng về sau, mình sẽ dùng AWS_PLATFORM_APPLICATION_APNS
để lưu lại.
Còn vấn đề nữa là device token
, cái này thì do client phải tự request lên các dịch vụ tương ứng, ví dụ như iOS thì cần request tới APNS. Cái này mình sẽ không đề cập chi tiết ở đây, client sẽ tự lo việc này và gửi device token
về cho chúng ta sử dụng.
Khi đã có device token
, ta sẽ request lên AWS SNS để khởi tạo endpoint, dùng làm đích.
Khởi tạo Endpoint
def sns_client
Aws::SNS::Client.new ...
end
def platform_endpoint
sns_client.create_platform_endpoint platform_application_arn: AWS_PLATFORM_APPLICATION_APNS,
token: device_token
Ta sẽ nhận được một object endpoint bạn vừa tạo, ta chỉ cần quan tâm tới thuộc tính endpoint_arn
trong object đó, hãy lưu lại string này tương ứng với client của bạn.
Publish nội dung tới Endpoint
def sns_client
Aws::SNS::Client.new
end
def publish_to_endpoint
return unless endpoint_arn
sns_client.publish target_arn: endpoint_arn, message: message,
message_structure: "json"
end
Khởi tạo topic
Để push notification tới nhiều thiết bị cùng một lúc, ta có thể push lần lượt từng thiết bị, tuy nhiên nó khá là nông dân. AWS SNS đã sinh ra khái niệm Topic, đúng như nghĩa đen của nó, khi ta push tới topic thì tất cả những thành viên client thuộc nó sẽ nhận được nội dung push, bên APNS gọi là Channel thì phải.
def sns
Aws::SNS::Resource.new
end
def create_topic
sns.create_topic name: topic_name
end
Nếu thành công bạn sẽ nhận được một object, và cũng chỉ cần quan tâm tới thuộc tính arn
của nó, lưu lại với tên topic bạn đặt để dùng sau này.
Tạo Subscription
Subscription là liên kết mối liên hệ của một client với một topic.
def sns_client
Aws::SNS::Client.new
end
def subscribe_user_to_topic
subscription = sns_client.subscribe topic_arn: topic_arn,
protocol: "application", endpoint: endpoint_arn
end
Nếu thành công bạn sẽ nhận được 1 object và tất nhiên, ta sẽ chỉ cần quan tâm tới thuộc tính subscription_arn
của nó, cái này cũng cần giữ lại, sau sẽ khởi tạo object subscription từ nó, dùng để xoá liên kết giữa client và topic. Chẳng hiểu sao bên AWS SNS không hỗ trợ việc remove trực tiếp client ra khỏi topic qua một method của topic, đỡ phải dùng cái này. Hoặc cũng có thể là mình chưa biết và chưa tìm thấy cách.
Publish to topic
Giờ là lúc publish tới topic mình muốn.
def sns
Aws::SNS::Resource.new
end
def get_topic topic
sns.topic topic # Cái này dùng để khởi tạo topic object dựa trên topic arn mình lưu bên trên
rescue
nil
end
def publish_to_topic
return unless topic
topic.publish message: message, message_structure: "json"
end
Vậy đó, giờ tất cả client dính với topic đó sẽ nhận được nội dung push mà không cần thủ công push cho từng thằng.
Khởi tạo message dạng json
Ta cần phải khởi tạo message để push với format do bên AWS SNS định nghĩa để bên client có thể nhận được đúng cấu trúc mong muốn. Để chi tiết thì bạn đọc vào thẳng tài liệu của AWS SNS nghiên cứu nhé
Send Custom Platform-Specific Payloads in Messages to Mobile Devices
Trong đó cũng có link tới các dịch vụ push của GCM hay APNS ... để kết hợp với cấu trúc AWS SNS, giúp client có thể đọc và phân tích hành vi cho từng notification cụ thể.
All rights reserved