AWS-SNS with Rails
Bài đăng này đã không được cập nhật trong 6 năm
Đố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
All rights reserved