Thử nghiệm push notification với AWS SDK và Ruby
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 ...
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ể.