【Java】Amazon SNSをつかってPush通知をおくる
やったこと
ユーザー毎のイベントに対して、プッシュ通知を送りたい。
以下みたいな感じです。
・Tinderでマッチングしたユーザーに対してPush通知をおくる
・Twitterでリツイートされたらリツイートされたユーザーに対してPush通知を送る
Amazon SNSについて
Amazon Simple Notification Service
この資料がわかりやすかったです。
https://speakerdeck.com/kiharu/http-pushtong-zhi
SNS は100万リクエスト/月が無料で利用できます。超過する場合でも、100万リクエスト毎に $1.0 と安価です。
Amason SNS 用語集
Amazon SNS独特の単語を理解するのに1番てこずりました。
Endpoint Arn
端末のトークン(android ならregistration ID)を登録すると、 このEndpoint Arnが作られる。 1台だけに配信する場合には、このEndpoint Arnを指定する。
Applications Arn
Push通知を送る対象のOSを区別するもの
- iOSなら"Apple Production"か"Apple Deveolpment"
- Androidなら"Google Cloud Messaging(GCM)"
Topic
1台だけに配信する場合には、このTopicを指定する。
Subscriptions
任意のTopicにエンドポイントをサブスクライブし、サブスクリプションが確認されると、
エンドポイントはそのトピックに発行されたすべてのメッセージを受信するようになる。
TopicとSubscriptionsは1対0..nの関係
ユーザー1人ずつにPush通知を送るなら、TopicとSubscriptionsは、使う必要がないです。
TopicとSubscriptionsは、複数のユーザーに対してまとめてPush通知を送る際に使うものです。
コード
// deviceTokenとApplicationArnからendpointArnを作成する public String createEndPoint(String appArn, String token) { AmazonSNSClient sns = new AmazonSNSClient(new ClasspathPropertiesFileCredentialsProvider()); CreatePlatformEndpointRequest cpeReq = new CreatePlatformEndpointRequest(); cpeReq.setPlatformApplicationArn(appArn); cpeReq.setToken(token); CreatePlatformEndpointResult result = sns.createPlatformEndpoint(cpeReq); return result.getEndpointArn(); }
public void sendPushNotification(String message, String endpointArn) { AmazonSNSClient sns = new AmazonSNSClient(new ClasspathPropertiesFileCredentialsProvider()); PublishRequest publishRequest = new PublishRequest(); publishRequest.setTargetArn(endpointArn); publishRequest.setMessage(message); sns.publish(publishRequest); }