Amazon SNS Mobile Pushを使ってiOSのPush Notificationを実装する

※iOS Dev Centerの開発者のみ閲覧が可能な画面キャプチャの公開はNDA違反になるというご指摘を頂いた為削除しました。

最近、巷で話題?のBaasですが、古くはParse.comやらWindows Azure Mobile Serviceなどがあるわけですが、AWSのSimple Notification Service(SNS)にMobile Push機能が実装されたという事で試してみました。

今回はAmazon SNSのコンソール画面を使ってiOSアプリにメッセージを通知してみたいと思います。

実装するに辺り色々と準備することがあります。大枠は下記の通りです。

  1. iOSに通知するメッセージを送るサーバーを準備(今回はAmazon SNSサービスを使用)
  2. 通知サービスが有効になったApp IDを作成
  3. Apple Push Notification Service(APNs)とサーバー間でメッセージをやりとりするための証明書を作成
  4. iOSアプリのプロピジョニングプロファイルを作成
  5. iOSアプリに実装して端末識別用のデバイストークンを取得
  6. デバイストークンと証明書を使ってSNSからメッセージを送信

それでは一つ一つについて詳細に説明します。

1. iOSに通知するメッセージを送るサーバーを準備


Amazon SNSの場合にはAWSアカウントを取っておいて下さい。後で、証明書を含めてアプリの登録を行います。

勿論、SNSを使わずに完全に自作することもできますが、コストパフォマンスを考えてもBaas系のサービスを使ったほうがお得だと思うので迷わず使いましょう。

2. 通知サービスが有効になったApp IDを作成


iOS Dev Centerに移動します。

次に左メニューから「App IDs > +」で新しいApp ID作成画面に移動します。

App Nameに適当な名前をつけます。

App IDにはワイルドカードでは無く一意に識別するBundle IDをつけます。今回は「com.aguuu.APNSforAmazonSNS」としました。

最後に、App Servicesの「Push Notifications」にチェックを入れてContinueボタンを押します。

3. Apple Push Notification Service(APNs)とサーバー間でメッセージをやりとりするための証明書を作成


続いて証明書を作成します。

「App IDs > 先ほど作成したApp ID」の順番で選択します。

該当のApp IDのEditボタンを押します。

App IDの編集画面が表示されるので下部の「Push Notifications」にチェックを入れます。

また、SSL Certificateという項目がありますが、これがサーバーとAPNs間でやりとりする為の証明書です。

開発用(Development)と本番用(Production)は別々の証明書になります。

今回は上の開発用証明書を作るので、上の「Create Cetificate」ボタンを押します。

その後つらつらと英語でメッセージが表示されますが、要約すると「キーチェーンで鍵を作ってね」ということなので、キーチェーンを起動します。

鍵の作り方はiOS Devおなじみの方法なのですが簡単に説明するとキーチェーンの上部メニューから「キーチェーンアクセス > 証明書アシスタント > 認証局に証明書を要求」の順番に選択します。

証明書情報でiOS Devに登録しているメールアドレスと名前を入力します。

要求の処理では「ディスクに保存」を選択して「続ける」ボタンを押してデスクトップなどの適当な場所に保存します。

2013091804

iOS Dev Centerに戻ります。

画面は「About Creating a Certificate Signing Request (CSR)」になっていると思うので「Continue」ボタンを押します。

「Upload CSR file」に先ほどキーチェーンから出力した「CertificateSigningRequest.certSigningRequest」ファイルを選択して「Generate」ボタンを押します。

しばらくすると「Your certificate is ready.」画面が表示されてファイルアップロードが完了します。

「Download」ボタンを押して証明書をダウンロードします。

「Done」ボタンを押して完了します。

先ほどiOS Dev Centerからダウンロードした証明書(aps_development.cer)をダブルクリックします。するとキーチェーンアクセスが起動します。

キーチェーンアクセスに「Apple Development iOS Push Services〜」という証明書が登録されているので右クリックして「Apple Development iOS Push Services〜を書き出す」を選択します。

2013091808

保存ダイアログが表示されるのでファイル名を入力して、フォーマットを「個人情報交換(.p12)」を選択して「保存」ボタンを押します。

ここで注意すべき点はファイル名に日本語を使うとAmazon SNSの証明書をアップロードする時に上手く認識されないので半角英字で保存しましょう。

また、キーチェインの左下の部分で「自分の証明書」を選択しないと「個人情報交換」を選択して保存が出来ないそうなので気をつけて。

今保存した「〜.p12」ファイルは後ほどAmazon SNSに登録する時に使います。

取り敢えずこれで証明書は準備できました。

2013091809

4. iOSアプリのプロピジョニングプロファイルを作成


プロビジョニングプロファイルは通常通り作りますが、気をつけるとしたらApp IDはワイルドカードでは無く最初に作ったApp ID「~.com.aguuu.APNSforAmazonSNS」を指定することくらいです。

適当にiOSアプリプロジェクトを作ります。

Bundle IdentifierはApp IDで指定(com.aguuu.APNSforAmazonSNS)したものに揃えますよ。

勿論、プロビジョニングプロファイルも先ほど作成したものを設定しますよ。

5. iOSアプリに実装して端末識別用のデバイストークンを取得


次のiOSアプリにPush Notificationを使うためのコードを実装します。

最低限必要なコードは「AppDelegate.m」に記述します。

「application:didFinishLaunchingWithOptions:」で「[UIApplication sharedApplication]registerForRemoteNotificationTypes:」を使って通知サービスへのアプリの登録を行います。

通知サービスにはAlert(テキストメッセージ)、Badge(アイコンへの数字表示)、Sound(通知時の音声)のタイプがあるので必要な物を通知サービスの登録時に渡します。

もしアプリが通知サービスへの登録が初めての場合は登録の有無を確認するダイアログが表示されます。

通知サービスに登録されると「application:didRegisterForRemoteNotificationsWithDeviceToken:」が呼ばれるので、この中でデバイストークン(端末識別子)を取得します。

今回はシンプルにするためにデバイストークンをNSLogで出力していますが、通常ならここで通知メッセージを送るサーバーにデバイストークンを投げてユーザー情報と紐付ける等して保存します。

#import “AppDelegate.h”
@implementation AppDelegate
– (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [[UIApplication sharedApplication]registerForRemoteNotificationTypes:
  (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
  return YES;
}

– (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
  NSString *deviceTokenValue = [NSString stringWithFormat:@”Device Token: %@”, deviceToken];
  NSLog(@”%@”, deviceTokenValue);
}
@end

NSLogで出力したデバイストークンをコピー(前後の<>カッコを取り除いて区切りの半角スペースを取り除く)しておきます。

2013091811

6. デバイストークンと証明書を使ってSNSからメッセージを送信


あとは、Amazon SNSからメッセージを送信してみましょう。

AWSのコンソール画面を開いてSNSを選択します。

左のメニューから「Apps」を選択して「Add a New App」ボタンを押します。

2013091812

アプリ登録画面が表示されるので下記の通り入力・選択します。

Application Name:任意

Push Platform:Apple Push Notification Service Sandbox(APNS_SANDBOX) ※本番の場合にはApple Push Notification Service(APNS)を選択

真ん中の証明書選択で、キーチェーンアクセスから書きだした「〜.p12」を選択して「Load Credentials from file」ボタンを押すと、下部の「Certificate」や「Private Key」に文字列が表示されます。

後は「Add New App」ボタンを押してアプリを登録します。

2013091813

登録されたアプリを選択すると下部に「Add Endpoint」ボタンが表示されるので押します。

EndpointとはつまりはiOS端末の事を表しています。

2013091814

Endpoint登録画面で

Device Token: 先ほどiOSアプリでNSLogに出力したデバイストークン(前後の<>と半角スペースを取り除いたもの)

User Data: 端末を識別する適用な名前

を入力して「Add Endpoint」ボタンを押します。

2013091815

後は、先ほど登録したEndpointを選択して「Publish」ボタンを押します。

2013091816

Messageに表示したいテキストを入力して「Publish Message」ボタンを押すとiOSアプリにメッセージが通知されるはずです。

2013091817

iOS系は相変わらず証明書周りが一苦労ですが、メッセージ通知自体はかなり簡単に実装できました。

今度、他のBaasも試して比べ見たいと思います。

Let’s enjoy the development.