【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);
}