Help us understand the problem. What is going on with this article?

[Swift]AWSのSNSを使ってiOSへPush通知

More than 3 years have passed since last update.

手順(ここでは下記5の「Xcode上で実装する」をメインに記載しています。)

  1. AppIDを作成する
  2. 通知用証明書を作成する
  3. プロビジョニングファイルを作成する
  4. Amazon SNSに証明書を登録する
  5. Xcode上で実装する

参考サイト(上から順に見て理解していくと手戻り少ない)

http://www.aguuu.com/archives/2013/09/amazon-sns-mobile-push-ios-push-notification/

http://www.lancork.net/2013/08/how-to-ios-push-first/

http://www.lancork.net/2013/08/how-to-ios-push-second/

http://www.slideshare.net/shimy_net/amazon-sns-mobile-push

http://www.slideshare.net/AmazonWebServicesJapan/aws-31275003

SwiftでAWSのSDKを導入する際に参考になるソース

https://github.com/awslabs/aws-sdk-ios-samples/tree/master/SNS-MobileAnalytics-Sample/Swift/

導入方法

1・Podfileに以下の内容を追加

source 'https://github.com/CocoaPods/Specs.git'

   pod 'AWSiOSSDKv2'

2・podコマンドを実行

pod update
pod install

3・ブリッジファイルに以下を追記

Bridging-Header.h
#import "AWSCore.h"
#import "SNS.h"

AWSのSNSで肝になる設定

AppDelegate.swift
let cognitoAccountId = "Your-AccountID"
let cognitoIdentityPoolId = "Your-PoolID"
let cognitoUnauthRoleArn = "Your-RoleUnauth"
let snsPlatformApplicationArn = "Your-Platform-Applicatoin-ARN"
let mobileAnalyticsAppId = "Your-MobileAnalytics-AppId"

osのバージョン毎の分岐(iOS7とiOS8対応で設定方法が異なるため)

AppDelegate.swift
        let osVersion = UIDevice.currentDevice().systemVersion
        if osVersion < "8.0" {
            application.registerForRemoteNotificationTypes(
                UIRemoteNotificationType.Badge |
                    UIRemoteNotificationType.Sound |
                    UIRemoteNotificationType.Alert )


        }else{

            var types: UIUserNotificationType = UIUserNotificationType.Badge |
                UIUserNotificationType.Alert |
                UIUserNotificationType.Sound

            var settings: UIUserNotificationSettings = UIUserNotificationSettings( forTypes: types, categories: nil )

            application.registerUserNotificationSettings( settings )
            application.registerForRemoteNotifications()
        }

deviceトークンのアラート部分

AppDelegate.swift
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        let deviceTokenString = "\(deviceToken)"
            .stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString:"<>"))
            .stringByReplacingOccurrencesOfString(" ", withString: "")
        NSUserDefaults.standardUserDefaults().setObject(deviceTokenString, forKey: "deviceToken")


        let alert = UIAlertView()
        alert.title = "deviceTokenString"
        alert.message = "\(deviceTokenString)"
        alert.addButtonWithTitle("OK")
        alert.show()


        let sns = AWSSNS.defaultSNS()
        let request = AWSSNSCreatePlatformEndpointInput()
        request.token = deviceTokenString
        sns.createPlatformEndpoint(request).continueWithExecutor(BFExecutor.mainThreadExecutor(), withBlock: { (task: BFTask!) -> AnyObject! in
            if task.error != nil {
                println("Error: \(task.error)")
            } else {
                let createEndpointResponse = task.result as AWSSNSCreateEndpointResponse
                println("endpointArn: \(createEndpointResponse.endpointArn)")
                NSUserDefaults.standardUserDefaults().setObject(createEndpointResponse.endpointArn, forKey: "endpointArn")
            }

            return nil
        })
    }

deviceトーキングのエビデンス

実行結果が正常ですと起動時に以下のようなアラートが飛びます。

089ffd5a520b4c75c7d4e7ab5b8c822d.png

まだdeviceトーキングのエビデンスが取得のみとなっており、
このままではまだ、push通知は行えません。
また、このままだと手動でdeviceトーキングの登録を
行うことになります。
Congntoを使って自動で登録出来るように設定していきます。

Cognto登録のためにAWSにユーザーを作成

60ad595e6f2824996374ecacf4463c55.png

AWSはユーザー作成必須でないので注意が必要です。

Cogntoを作成

888852507ea3c58c1b3703a7575343f4.png

b25efcd2289045be0d6153a0ac14d4f4.png

AWS SNSを設定しCogntoとの接続を行う

e0109f2e8ce5ea54be07ee9b024470e6.png

メッセージのサンプルコード(JSON形式)

{
 "APNS_SANDBOX":"{\"aps\":{\"alert\":\"Pushサンプルメッセージ\",\"sound\":\"default\",\"badge\":0}}"
}

注意

  1. CognitoとSNSは同一のregionを指定。異なるregion(例:CognitoはUS、SNSはTokyo)だとエラーになり、エンドポイントは登録されない

エラー

内容:エンドポイントが取得出来ずにエラーになる

ログ

エラー「Domain=NSCocoaErrorDomain Code=3000 "Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません" ........」

解決方法
Push Notification用の設定をしたプロビジョニングファイルを作成し、Xcodeに適用させる

http://obc-fight.blogspot.jp/2013/07/domainnscocoaerrordomain-code3000.html

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした