話題の記事

[AWS] Amazon SNS の新機能「Mobile Push」を iOS で使ってみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon SNS Mobile Push

以下の画像をご覧ください。キタコレ!

snspush-000

がしかし、諏訪くんに先を超されてしまいしたw。こちらでは、Amazon SNSを使ってApple iOS端末にプッシュ通知したいと思います。Androidな方は以下の記事をご覧ください。

[AWS] Amazon SNS の新機能「Mobile Push」を Android で使ってみた

Apple Push Notification Services(APNS)

APNSは、Appleが管理するiOS端末宛のプッシュ通知サービスです。今まで、このプッシュ通知を使うためには、BaaSや自前での構築が必要でしたが、今回の新機能によってAWSがやってくれるんですね!本記事では、Amazon SNSからMobile Pushを使ってAPNS経由でiOS端末に通知をすることができることをご紹介したいと思います。

プッシュ通知用の証明書作成

APNSを利用するためには、まずは証明書周りを揃える必要があります。今回は、実機を使ってテストをしますので、Apple Developer Programsに加入してください。そして、ポータルからAPNS用の証明書を作成します。まず、はじめに証明書リクエストファイルを作成します。

キーチェーンアクセスを開いて、証明書アシスタントから認証局に証明書を要求します。CertificateSigningRequest.certSigningRequestというファイルが出来上がりますね。次に、ポータルからAPNS用に証明書リクエストファイルをアップロードして、アプリケーションIDを作成して、デバイスを登録して、プロビジョニングファイルを作成します。説明を省略し過ぎですねっっw

ポータルトップ

snspush-002

証明書作成

snspush-001

アプリケーションID作成。APNS用はワイルドカード指定しないように気をつけましょう。ハマります。

snspush-003

iOSデバイスを登録します。今回は開発機で使うので登録する必要があります。

snspush-004

プロビジョニングファイルを作成してダウンロードします。

snspush-005

これで下準備ができましたね。

プッシュ通知を受け取るiOSアプリを作成する

ここからは、Objective-Cです。

//
//  AppDelegate.m
//  SNSApp
//
//  Created by satoshi on 2013/08/14.
//  Copyright (c) 2013年 satoshi. All rights reserved.
//

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"Registering for push notifications...");
    [[UIApplication sharedApplication]registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
    NSLog(@"%@",str);
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
    NSString *str = [NSString stringWithFormat: @"Error: %@", err];
    NSLog(@"%@",str);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    NSLog(@"ReceiveRemoteNotification on foreground: %@", userInfo);
    [UIApplication sharedApplication].applicationIconBadgeNumber = 2;
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [UIApplication sharedApplication].applicationIconBadgeNumber = 1;
}

@end

簡単に解説しますと、アプリ起動時にdidFinishLaunchingWithOptionsが呼ばれます。そこで、プッシュ通知を受け取るか確認画面が初回だけ出ます。問題なければ次にdidRegisterForRemoteNotificationsWithDeviceTokenが呼ばれます。ここで、デバイスとAPNSを繋ぐユニークなIDが発行されます。これは、Amazon SNSから特定のiOSデバイスにプッシュ通知するために必要なもので、通常はサーバーサイドにPOSTしてデータベースなどに登録しておきます。今回は後でコピペして使います。

それでは、実機を使ってアプリを実行してみましょう。Device Tokenのところに文字が並んでいますね。これがデバイスとAPNSを繋ぐIDです。 テキストをコピーしておいてください。後で、括弧とスペースを除いた文字列を使います。

2013-08-14 05:14:30.138 SNSApp[1616:907] Registering for push notifications...
2013-08-14 05:14:30.155 SNSApp[1616:907] Device Token=<XXXXXXXX YYYYYYYY ZZZZZZZZ AAAAAAAA BBBBBBBB CCCCCCCC 1f34cd15 9983d2ef>

Amazon SNSからプッシュ通知する

さて、メインディッシュです。AWS管理コンソールをご覧ください。Amazon SNSのUIが変わっていますね。今まではTopicの作成のみでしたが、今回からAppの作成ができるようになっています。そして、証明書のアップロードをしています。ここでのポイントとして、p12形式で出力したものをアップロードしつつ設定したパスワードを入力することです。

snspush-012

次にプッシュ通知先アプリのエンドポイントを登録します。先ほどコピーしたDevice Tokenの文字列をペーストしてください。

snspush-006

うまくいけば以下のように登録されます。

snspush-007

それでは、プッシュ通知をするために、Publishボタンを押します。そして、メッセージを入力しましょう。iOSのAPNSは、特定のJSONフォーマットで送ることでポップアップ表示してくれます。まずはテキストでメッセージを入れた後に、2つ目のラジオボタンを選択してJSON形式に変換してください。

snspush-008-2

動作確認

最後に動作確認です。こんか感じで表示されれば成功ですね。

snspush-010

snspush-000

良い感じですね!!

まとめ

Amazon SNS Mobile Push機能を使うことで、Apple iOS端末向けにプッシュ通知を行うことが出来ました!Objective-Cのコードは、そのまま全て使い回すことができるもので、AWSならではのコードは一切ありません。ぜひお試しください。

参考資料

Amazon Simple Notification Service Developer Guide - Getting Started with APNS

Apple Push Notification Services in iOS 6 Tutorial: Part 1/2

[iOS SDK] Apple Push Notification Service (APNs) を試してみる件.

Apple Developer Programs