12/08/2018, 17:44

AWS-SNS with Rails

Đối với việc push notification trên mobile app thì chúng ta có GCM dành cho android và APNS cho ios, nhưng sử dụng AWS SNS, với một yêu cầu duy nhất, chúng ta có thể nhắm push trên cả thiết bị Android và iOS. Và tất nhiên, nó rẻ ngay cả vượt qua free tier 1 million push notifications per month. Và ...

Đối với việc push notification trên mobile app thì chúng ta có GCM dành cho android và APNS cho ios, nhưng sử dụng AWS SNS, với một yêu cầu duy nhất, chúng ta có thể nhắm push trên cả thiết bị Android và iOS. Và tất nhiên, nó rẻ ngay cả vượt qua free tier 1 million push notifications per month. Và sau đây chúng ta sẽ cùng cài đặt trên rails application. Thêm vào Gemfile

gem "aws-sdk", "~> 2"

Tạo platform applications trên AWS

Cấu hình AWS

#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"]

Tạo 1 builder để build message cho android và ios

class Aws::Sns::Message
  attr_accessor :content, :type, :sound, :id

  def to_json
    case type
    when "IOS"
      {
        APNS:  ios_payload.to_json,
        APNS_SANDBOX: ios_payload.to_json
      }
    else
      {
        GCM: android_payload.to_json
      }
    end.to_json
  end

  private

  def ios_payload
    {
      aps: {
        alert: content,
        sound: sound || "default"
      },
      notification_id: id
    }
  end

  def android_payload
    {
      data: {
        message: notification.title,
        notification_id: id
      }
    }
  end

  class << self
    def build
      builder = new
      yield builder
      builder
    end
  end
end

Tạo push service

class Aws::Sns::PushService
  def initialize
    @sns_client = Aws::SNS::Client.new
  end

  def push sns_message, device_token
    @sns_client.publish(
      target_arn: endpoint_arn(device_token, sns_message.type),
      message: sns_message.to_json,
      message_structure: :json
    )
  rescue Aws::SNS::Errors::ServiceError => e
    Logger.new(Rails.root.join("log", "notification_push.log")).warn e.message
  end

  private

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

Và sử dụng nó khi bạn cần

sns_message = Aws::Sns::Message.build do |msg|
    msg.id = 1
    msg.content = "title"
    msg.type = "IOS"
end

Aws::Sns::PushService.new.push sns_message, device_token

Just memo, chúc các bạn thành công

0