[Swift] Amazon SNS で iOSアプリにPush通知を送信する #アドカレ2015

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

はじめに

こんにちは! haruhatahikoです。
AWSモバイルアドベントカレンダー7日目の記事になります。

Amazon SNS のモバイルプッシュ通知を使って、iOSアプリにPush通知を送信します。
1台を指定して送信する方法と、複数台にまとめて送信する方法の2種類紹介します。
iOSアプリ側の実装は Swift で行います!

Provisioning Profile を作成

  1. Certificate の作成
  2. App ID の作成
  3. デバイスの登録
  4. Provisioning Profile の作成

Certificate の作成

以下を参考に Certificate を作成してください。
よく分かる!iOS アプリ開発に必要な証明書ファイルの作成方法 2015年版

App ID の作成

Push Notification にチェックし、新しく App ID を作成します。

aws-amazon-sns-mobile-push-swift_01

この段階ではConfigurable になっています。

aws-amazon-sns-mobile-push-swift_02

Push Notifications用の Certificate を作成します。

aws-amazon-sns-mobile-push-swift_03

アップロードすると Development が Enabled になりました!

aws-amazon-sns-mobile-push-swift_04

デバイスの登録

Xcodeの Window > Organizer から UUID を参照し、テスト用のデバイスを登録します。

Provisioning Profile の作成

Provisioning Profile を作成します。

aws-amazon-sns-mobile-push-swift_05

App ID、Certificate、デバイスを選択します。 下記画面に遷移後、Profileの名前を入力します。

aws-amazon-sns-mobile-push-swift_06

ダウンロードして、インストールします。

aws-amazon-sns-mobile-push-swift_07

証明書ファイルの書き出し

キーチェーンアクセス表示し先ほど登録した Remote Notification 用の Certificate を選択します。
右クリックを押して「"Apple Development iOS Push Services: アプリ名"を書き出す」を選び、P12 ファイルを書き出します。
こちらは Amazon SNS を設定する際に使用します。

Amazon Cognito の設定

1. CognitoIdentityPoolId を作成する

今回のサンプルではAWS SDKを利用して、
デバイストークンの登録や、トピックの受信登録を行う為、CognitoIdentityPoolId を作成します。

aws-amazon-sns-mobile-push-swift_08

作成された CognitoIdentityPoolId は Edit identity pool から参照する事ができます。
作成された CognitoIdentityPoolId は後で設定に使用します。

aws-amazon-sns-mobile-push-swift_09

2. ポリシーを編集する

Cognito 設定時に自動で作成された IAM を表示し、「ポリシーの編集」をクリックします。

aws-amazon-sns-mobile-push-swift_10

Action と Resource に下記内容を追記し、「ポリシーの適用」をクリックします。

aws-amazon-sns-mobile-push-swift_11

Amazon SNS の設定

1. Platform Application を作成する

「Create Platform Application」をクリックします。

aws-amazon-sns-mobile-push-swift_12

項目名
Application Name 適当なアプリケーション名を入力
Push Notification Platform Apple Development
Push Certificate Type iOS Push Certificate
Choose P12 File 先ほど作成した P12 ファイル
Enter Password P12 ファイル生成時に設定したパスワード

上記内容を入力し「Load Credential File」をクリックすると、Certificate と Private Key が表示されます。
その後、「Create Platform Application」をクリックします。

aws-amazon-sns-mobile-push-swift_13

作成された Platform Application の Arn は後で設定に使用します。

2. Topic を作成する

複数台にまとめて送信する為に Topic も作成します。 「Create new topic」をクリックします。

aws-amazon-sns-mobile-push-swift_14

Topic name を入力し、「Create topic」をクリックします。

aws-amazon-sns-mobile-push-swift_15

作成された Topic の Arn は後で設定に使用します。

AWS SDKを組み込む

1. ライブラリを追加する

Podfileに下記内容を追加し、 pod install を実施します。

pod 'AWSSNS'

2. Bridging Header を追加する

下記内容を記述した ObjectiveC_Bridging_Header.h というファイルを作成します。

#import <AWSSNS/AWSSNS.h>

その後、「Objective-C Bridging Header」に新しく追加したファイルを指定します。

aws-amazon-sns-mobile-push-swift_16

3. AWS SDK の初期設定

// Sets up the AWS Mobile SDK for iOS
let credentialsProvider = AWSCognitoCredentialsProvider(
    regionType: AWSRegionType.APNortheast1,
    identityPoolId: "YourCognitoIdentityPoolId")
let defaultServiceConfiguration = AWSServiceConfiguration(
    region: AWSRegionType.APNortheast1,
    credentialsProvider: credentialsProvider)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration

※ 先ほど作成した CognitoIdentityPoolId に差し替えてください。

4. デバイストークンの登録、トピックに受信登録

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let deviceTokenString = "\(deviceToken)"
        .stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString:"<>"))
        .stringByReplacingOccurrencesOfString(" ", withString: "")
    print("deviceTokenString: \(deviceTokenString)")

    let sns = AWSSNS.defaultSNS()
    let request = AWSSNSCreatePlatformEndpointInput()
    request.token = deviceTokenString
    request.platformApplicationArn = "YourSNSPlatformApplicationArn"
    sns.createPlatformEndpoint(request).continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: { (task: AWSTask!) -> AnyObject! in
        if task.error != nil {
            print("Error: \(task.error)")
        } else {
            let createEndpointResponse = task.result as! AWSSNSCreateEndpointResponse
            print("endpointArn: \(createEndpointResponse.endpointArn)")

            let subscribeRequest = AWSSNSSubscribeInput()
            subscribeRequest.topicArn = "YourSNSTopicArn";
            subscribeRequest.endpoint = createEndpointResponse.endpointArn;
            subscribeRequest.protocols = "Application";
            sns.subscribe(subscribeRequest)
        }
        return nil
    })
}

※ 先ほど作成した SNSPlatformApplicationArn に差し替えてください。
※ 先ほど作成した SNSTopicArn に差し替えてください。

動作確認

1台だけに送信する

作成した Platform Application の「ARN」をクリックします。

aws-amazon-sns-mobile-push-swift_17

送信したい Endpoint を選択し、「Publish to Endpoint」をクリックします。

aws-amazon-sns-mobile-push-swift_18

メッセージを入力し、「Publish Message」をクリックします。

aws-amazon-sns-mobile-push-swift_19

送信されました!!

aws-amazon-sns-mobile-push-swift_22

複数台に送信する

送信したい Topic を選択し、「Publish to topic」をクリックします。

aws-amazon-sns-mobile-push-swift_20

メッセージを入力し、「Publish Message」をクリックします。

aws-amazon-sns-mobile-push-swift_21

送信されました!!

aws-amazon-sns-mobile-push-swift_23

参考

https://dev.classmethod.jp/cloud/aws-amazon-sns-mobile-push-ios/
https://dev.classmethod.jp/cloud/aws/sns-publish-to-os-x/
http://qiita.com/g08m11/items/7c7df410596cb9a72fd0

まとめ

以上の手順で Amazon SNS を使って、iOSアプリにPush通知を送信する事が出来ました!

明日(12月8日)は、深澤 豪さんの Mobile Analytics for Web についての記事です。