AWS SNS - Mobile Push Notification dùng Ruby on Rails

SNS (Amazon Simple Notification) là một web service của amazon quản lý việc gửi notification tới các client. Giá AWS SNS có thể nó là rẻ nếu so sánh với các dịch vụ khác của Amazon. Sau đây mình sẽ giớ thiệu các bước cần thiết để sử dung AWS SNS.

Config AWS SNS

Để sử dụng được dịch vụ AWS SNS cái đầu tiền cần phải làm đó là config trên AWS Management Console. Sử dụng tài khỏan của Amazon để login to AWS Management Console. Bấm vào nút Get started sẽ hiển thị SNS dashboard. Chọn Create platform application , chỗ push notification platform chọn platform muốn push notification Kết nối với dịch vụ notification của Google hoặc Apple cần credential

  • Android platform (Google cloud message) cần GCM API key từ google developer
  • IOS platform (Apple production/ Appple development) cần generate IOS push certificate

Gửi notification từ Ruby

Trong project rails install gem aws-sdk để push notification. Sau đó add config trong file config/initializers/aws.rb

Aws.config[:credentials] = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'],  ENV['AWS_SECRET_ACCESS_KEY'])
Aws.config[:region] = ENV["AWS_REGION"]

Lấy AWS_REGION , AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY từ trong tài khỏan của amazon (username -> My Security Credentials -> Access keys (access key ID and secret access key)) Viết một service để gọi khi push notification

module Notify
  class AwsPusher
    attr_reader :device, :content

    def initialize device, content = {}
      @device = device
      @content = content
    end

    def push
      sns_client.publish(target_arn: endpoint_arn, message: message, message_structure: :json) if endpoint_arn
    end

    private
    def sns_client
      @sns_client ||= Aws::SNS::Client.new
    end

    def endpoint_arn
      sns_client.create_platform_endpoint(
        platform_application_arn: ENV["AWS_#{device.device_type}_ARN"], token: device.token).endpoint_arn
    end

    def message
      payload = {
        aps: {
          alert: content[:message],
          sound: "default"
        }
      }

      {
        APNS:  payload.to_json,
        APNS_SANDBOX: payload.to_json
      }.to_json
    end
  end
end

Khi push notification chỉ cần gọi

Notify::AwsPusher.new(device, content).push
  • content là nội dung hiển thị trong notification của các device
  • device là một object có token và device_type (token là của các device dùng để push notification do bên client generate ra)