0

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
  • 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí