読者です 読者をやめる 読者になる 読者になる

Amazon SNSを使ってiPhoneにpush notificationしてみた

AWSからmobile push notificationが使えるということなので、試してみました。
SNSはSimple Notification Serviceのことです。
元気があればはてなカウンティングのアプリあたりに実装してみたいですね。

Developer Center / ローカルMac を使って通知用の証明書を作成する

  1. Developer CenterのiOSで"Certificates"を選択
  2. 画面右上にある「+」をクリック
  3. Add iOS Certificate で、Development の "Apple Push Notification service SSL (Sandbox)"を選択(本番のときはProduction の"Apple Push Notification service SSL (Production)")
  4. "Which App ID would you like to use?" という画面で、通知を送信したいアプリのApp IDをプルダウンから選択(このとき、ワイルドカードのApp IDを指定してはいけない)
  5. "About Creating a Certificate Signing Request (CSR)"という画面になるので、書かれているとおりにファイルを作る
    1. ローカルのMacで「キーチェインアクセス」を起動
    2. メニューの「証明書アシスタント」→「認証局に証明書を要求...」
    3. ユーザのメールアドレスにメアド、通称に秘密鍵の名前を入力。CAのメールアドレスは空欄にしておく。要求の処理を「ディスクに保存」を選択して「続ける」
    4. ファイル "CertificateSigningRequest.certSigningRequest "を保存
  6. Continueを押して次の画面へすすみ、Choose Fileで "CertificateSigningRequest.certSigningRequest"を選択して Generate を押下
  7. "Download"を押下して、aps_development.cer をダウンロード
  8. ファイルをダブルクリックすると、キーチェインアクセスの「証明書」のところに、"Apple Development iOS Push Service : " が追加される。
  9. 追加された行を右クリックして「"Apple Development iOS Push Service : " を書き出す」を選択
  10. iso_development_push_service.p12 というような適当な名前をつけて保存
    1. パスワードを求められるので適当なパスワード(A)を入力する(このパスワードをあとでAWSに登録するときに使います)
    2. キーチェインログインのパスワードを求められるので、ログインに使っているパスワードを入力

AWSでの作業

  • AWSのアカウントは作成済みという前提です
  1. https://console.aws.amazon.com/console/home から「SNS push notification service」を選択
  2. SNSのコンソール画面になるので、使いたいリージョンを右上のプルダウンから選択f:id:chris4403:20131015184014p:plain
  3. 「Add New App」をクリックしてアプリケーションを登録
    1. Application Nameはあとで分かるように識別可能な名前を入力
    2. Push Platformは「Apple Push Notification Service Sandbox (APNS_SANDBOX)」を選択(本番環境で使うときは「Apple Push Notification Service (APNS)」を選択)
    3. ChooseFileは、先ほど作成した「iso_development_push_service.p12」を指定
    4. パスワードはその際に入力したパスワード(A)を入力(キーチェインのログインパスワードじゃないです)
    5. 「Load Credentials from File」を押下すると、Certificateの欄とPrivate Keyの欄が埋まるので、「Add New App」を押下
    • この時点でファイルの読み込みがうまくいかない場合は、ファイルの作成に失敗しているので戻ってやり直してください
    • f:id:chris4403:20131015184159p:plainf:id:chris4403:20131015184436p:plain
  4. アプリケーションの登録はこれで完了です
    • 画面内の「Application ARN」というところに書かれている値が、アプリケーションを一意に特定するキーになります(あとで使います)f:id:chris4403:20131015184506p:plain

Endpoint(送信する先の端末)の追加

  • 実際のアプリケーションからはAPI経由で登録することになると思いますが、一応コンソールから追加してみます。
  1. 「Add Endpoints」をクリックして、端末で取得したDevice Tokenを入力します。User Dataの欄はとりあず空白でも良いです
    • CSVファイルを使ってまとめてアップもできますf:id:chris4403:20131015184513p:plain
  2. 追加したら、左端のチェックボックスにチェックをいれて、「Endopints Actions」のプルダウンから「Publish」を選択しますf:id:chris4403:20131015184519p:plain
  3. message欄に送信したいメッセージを入力して 「Publish Message」を押すとメッセージが送信されます。

APIを使う

  • 実際には、送信したい先の端末はどんどん増えていきますし、メッセージをコンソールから送信するということもほとんどないと思います。公開されているAPIを使ってプログラムから送信してみます。
  • さて、Perlの便利なモジュールを探してみたんですが、mobileのpush notificationに対応しているモジュールが公開されていませんでした。
  • かろうじて https://github.com/dwery/amazon-sns を見つけたので、forkして足りないメソッドを足してみました
  • 使いかたはこんな感じです
use Amazon::SNS;
my $sns = Amazon::SNS->new({
    service => 'http://sns.ap-northeast-1.amazonaws.com', # AWSのリージョン
    key     => 'XXXXXXXXXXXXX', # API KEY
    secret  => 'XXXXXXXXXXXXXXXXXXXXXXXX', # API の secret
});
my $arn = "arn:aws:sns:us-west-2:XXXXXXXXXXXX:app/APNS_SANDBOX/SampleApp1";
my $app = $sns->GetPlatformApplication($arn);
my $endpoint_arn = "arn:aws:sns:us-west-2:XXXXXXXXXXXX:endpoint/APNS_SANDBOX/SampleApp1/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
my $endpoint = $app->GetEndpoint($endpoint_arn); # endpoint arn からendpointを生成
$endpoint->Publish("Hello world!"); # メッセージを送信

雑感

  • 通知周りの面倒な部分を簡単に実装できてよかった