メニュー
Amazon Cognito
開発者ガイド (Version 最終更新日: 2017 年 8 月 26 日)

プッシュ同期

Amazon Cognito は自動的に ID とデバイス間の関連付けを追跡します。プッシュ同期機能を使用すると、ID データが変更されたときに、特定の ID のすべてのインスタンスに確実に通知されます。プッシュ同期では、特定の ID の同期ストアデータが変更されるたびに、その ID に関連付けられているすべてのデバイスが、変更について知らせるサイレントのプッシュ通知を確実に受け取ります。

注記

プッシュ同期は JavaScript、Unity、Xamarin ではサポートされません。

プッシュ同期を使用する前に、まずプッシュ同期をアカウントでセットアップし、Amazon Cognito コンソールのプッシュ同期を有効にする必要があります。

Amazon Simple Notification Service(Amazon SNS) アプリケーションの作成

SNS 開発者ガイド』で説明されているように、サポートされているプラットフォーム用の Amazon SNS アプリを作成して設定します。

Amazon Cognito コンソールでのプッシュ同期の有効化

Amazon Cognito コンソールを通じてプッシュ同期を有効にできます。コンソールのホームページから、次の操作を行います。

  1. プッシュ同期を有効にする ID プールの名前をクリックします。ID プールの [Dashboard] ページが表示されます。

  2. [Dashboard] ページの右上にある、[Edit identity pool] をクリックします。[Edit identity pool] ページが表示されます。

  3. 下にスクロールし、[Push synchronization] をクリックして展開します。

  4. [Service Roles] ドロップダウンメニューで、SNS 通知を送信する Cognito アクセス権限を付与する IAM ロールを選択します。AWS IAM コンソールで、ID プールに関連付けられたロールを作成または変更するには、[Create role] をクリックします。

  5. プラットフォームアプリケーションを選択し、[Save Changes] をクリックします。

  6. アプリケーションへの SNS アクセスの許可

IAM コンソールで、完全な SNS アクセス権を持つように IAM ロールを設定するか、cognito-sync を信頼し、完全な SNS アクセス権を持つ新しいロールを作成します。IAM ロールの詳細については、「ロール(委任とフェデレーション)」を参照してください。

アプリケーションでのプッシュ同期の使用: Android

アプリケーションは、Google Play サービスをインポートする必要があります。Android SDK マネージャーから、最新バージョンの Google Play SDK をダウンロードできます。Android のドキュメントで、「Implementing a GCM client」に従ってアプリを登録し、GCM から登録 ID を受け取ります。登録 ID を取得したら、次のスニペットに示すように、デバイスを Amazon Cognito に登録する必要があります。

Copy
String registrationId = "MY_GCM_REGISTRATION_ID"; try { client.registerDevice("GCM", registrationId); } catch (RegistrationFailedException rfe) { Log.e(TAG, "Failed to register device for silent sync", rfe); } catch (AmazonClientException ace) { Log.e(TAG, "An unknown error caused registration for silent sync to fail", ace); }

これで、デバイスをサブスクライブして、特定のデータセットからアップデートを受け取ることができます。

Copy
Dataset trackedDataset = client.openOrCreateDataset("myDataset"); if (client.isDeviceRegistered()) { try { trackedDataset.subscribe(); } catch (SubscribeFailedException sfe) { Log.e(TAG, "Failed to subscribe to datasets", sfe); } catch (AmazonClientException ace) { Log.e(TAG, "An unknown error caused the subscription to fail", ace); } }

データセットからプッシュ通知の受け取りを中止するには、unsubscribe メソッドを呼び出します。CognitoSyncManager オブジェクトのすべてのデータセット (または特定のサブセット) にサブスクライブするには、subscribeAll() を使用します。

Copy
if (client.isDeviceRegistered()) { try { client.subscribeAll(); } catch (SubscribeFailedException sfe) { Log.e(TAG, "Failed to subscribe to datasets", sfe); } catch (AmazonClientException ace) { Log.e(TAG, "An unknown error caused the subscription to fail", ace); } }

Android BroadcastReceiver オブジェクトの実装で、最新バージョンの変更されたデータセットを確認して、アプリをもう一度同期する必要があるかどうか判断できます。

Copy
@Override public void onReceive(Context context, Intent intent) { PushSyncUpdate update = client.getPushSyncUpdate(intent); // The update has the source (cognito-sync here), identityId of the // user, identityPoolId in question, the non-local sync count of the // data set and the name of the dataset. All are accessible through // relevant getters. String source = update.getSource(); String identityPoolId = update.getIdentityPoolId(); String identityId = update.getIdentityId(); String datasetName = update.getDatasetName; long syncCount = update.getSyncCount; Dataset dataset = client.openOrCreateDataset(datasetName); // need to access last sync count. If sync count is less or equal to // last sync count of the dataset, no sync is required. long lastSyncCount = dataset.getLastSyncCount(); if (lastSyncCount < syncCount) { dataset.synchronize(new SyncCallback() { // ... }); } }

プッシュ通知のペイロードでは、次のキーを利用できます。

  • source: cognito-sync。これは、通知間の差別化要素として機能します。

  • identityPoolId: ID プールの ID。これは検証や追加の情報用に使用できますが、レシーバーの観点からは不可欠ではありません。

  • identityId: プール内のアイデンティティ ID。

  • datasetName: 更新されたデータセットの名前。これは openOrCreateDataset 呼び出しの目的で利用できます。

  • syncCount: リモートデータセットの同期カウント。これは、ローカルデータセットが古くなっていないこと、および入力同期が新しいことを確認する方法として使用できます。

アプリでプッシュ同期を使用する: iOS - Objective-C

アプリ用のデバイストークンを取得するには、Apple ドキュメントの「Registering for Remote Notifications」を参照してください。デバイストークンを NSData オブジェクトとして APN から受け取ったら、次に示すように同期クライアントの registerDevice: メソッドを使用して、Amazon Cognito にデバイスを登録する必要があります。

Copy
AWSCognito *syncClient = [AWSCognito defaultCognito]; [[syncClient registerDevice: devToken] continueWithBlock:^id(AWSTask *task) { if(task.error){ NSLog(@"Unable to registerDevice: %@", task.error); } else { NSLog(@"Successfully registered device with id: %@", task.result); } return nil; } ];

デバッグモードでは、デバイスは APN サンドボックスで登録されます。リリースモードでは、APN で登録されます。特定のデータセットからアップデートを受けるには、subscribe メソッドを使用します。

Copy
[[[syncClient openOrCreateDataset:@"MyDataset"] subscribe] continueWithBlock:^id(AWSTask *task) { if(task.error){ NSLog(@"Unable to subscribe to dataset: %@", task.error); } else { NSLog(@"Successfully subscribed to dataset: %@", task.result); } return nil; } ];

データセットからプッシュ通知の受け取りを中止するには、unsubscribe メソッドを呼び出します。

Copy
[[[syncClient openOrCreateDataset:@”MyDataset”] unsubscribe] continueWithBlock:^id(AWSTask *task) { if(task.error){ NSLog(@"Unable to unsubscribe from dataset: %@", task.error); } else { NSLog(@"Successfully unsubscribed from dataset: %@", task.result); } return nil; } ];

AWSCognito オブジェクトのすべてのデータセットをサブスクライブするには、subscribeAll を呼び出します。

Copy
[[syncClient subscribeAll] continueWithBlock:^id(AWSTask *task) { if(task.error){ NSLog(@"Unable to subscribe to all datasets: %@", task.error); } else { NSLog(@"Successfully subscribed to all datasets: %@", task.result); } return nil; } ];

subscribeAll を呼び出す前に、少なくとも各データセットで 1 回同期を行い、データセットがサーバー上に存在するようにします。

プッシュ通知に応答するには、アプリの代理で didReceiveRemoteNotification メソッドを実装する必要があります。

Copy
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { [[NSNotificationCenter defaultCenter] postNotificationName:@"CognitoPushNotification" object:userInfo]; }

通知ハンドラーを使用して通知を投稿する場合は、データセットへのハンドルがある、アプリケーションの他の場所で通知に応答することができます。次のように通知にサブスクライブしているとします。

Copy
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceivePushSync:) name: :@"CognitoPushNotification" object:nil];

その場合は、次のように通知に応答できます。

Copy
- (void)didReceivePushSync:(NSNotification*)notification { NSDictionary * data = [(NSDictionary *)[notification object] objectForKey:@"data"]; NSString * identityId = [data objectForKey:@"identityId"]; NSString * datasetName = [data objectForKey:@"datasetName"]; if([self.dataset.name isEqualToString:datasetName] && [self.identityId isEqualToString:identityId]){ [[self.dataset synchronize] continueWithBlock:^id(AWSTask *task) { if(!task.error){ NSLog(@"Successfully synced dataset"); } return nil; }]; } }

プッシュ通知のペイロードでは、次のキーを利用できます。

  • source: cognito-sync。これは、通知間の差別化要素として機能します。

  • identityPoolId: ID プールの ID。これは検証や追加の情報用に使用できますが、レシーバーの観点からは不可欠ではありません。

  • identityId: プール内のアイデンティティ ID。

  • datasetName: 更新されたデータセットの名前。これは openOrCreateDataset 呼び出しの目的で利用できます。

  • syncCount: リモートデータセットの同期カウント。これは、ローカルデータセットが古くなっていないこと、および入力同期が新しいことを確認する方法として使用できます。

アプリでプッシュ同期を使用する: iOS - Swift

アプリ用のデバイストークンを取得するには、Apple ドキュメントの「Registering for Remote Notifications」を参照してください。デバイストークンを NSData オブジェクトとして APN から受け取ったら、次に示すように同期クライアントの registerDevice メソッドを使用して、Amazon Cognito にデバイスを登録する必要があります。

Copy
let syncClient = AWSCognito.default() syncClient.registerDevice(devToken).continueWith(block: { (task: AWSTask!) -> AnyObject! in if (task.error != nil) { print("Unable to register device: " + task.error.localizedDescription) } else { print("Successfully registered device with id: \(task.result)") } return task })

デバッグモードでは、デバイスは APN サンドボックスで登録されます。リリースモードでは、APN で登録されます。特定のデータセットからアップデートを受けるには、subscribe メソッドを使用します。

Copy
syncClient.openOrCreateDataset("MyDataset").subscribe().continueWith(block: { (task: AWSTask!) -> AnyObject! in if (task.error != nil) { print("Unable to subscribe to dataset: " + task.error.localizedDescription) } else { print("Successfully subscribed to dataset: \(task.result)") } return task })

データセットからプッシュ通知の受け取りを中止するには、unsubscribe メソッドを呼び出します。

Copy
syncClient.openOrCreateDataset("MyDataset").unsubscribe().continueWith(block: { (task: AWSTask!) -> AnyObject! in if (task.error != nil) { print("Unable to unsubscribe to dataset: " + task.error.localizedDescription) } else { print("Successfully unsubscribed to dataset: \(task.result)") } return task })

AWSCognito オブジェクトのすべてのデータセットをサブスクライブするには、subscribeAll を呼び出します。

Copy
syncClient.openOrCreateDataset("MyDataset").subscribeAll().continueWith(block: { (task: AWSTask!) -> AnyObject! in if (task.error != nil) { print("Unable to subscribe to all datasets: " + task.error.localizedDescription) } else { print("Successfully subscribed to all datasets: \(task.result)") } return task })

subscribeAll を呼び出す前に、少なくとも各データセットで 1 回同期を行い、データセットがサーバー上に存在するようにします。

プッシュ通知に応答するには、アプリの代理で didReceiveRemoteNotification メソッドを実装する必要があります。

Copy
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { NSNotificationCenter.defaultCenter().postNotificationName("CognitoPushNotification", object: userInfo) })

通知ハンドラーを使用して通知を投稿する場合は、データセットへのハンドルがある、アプリケーションの他の場所で通知に応答することができます。次のように通知にサブスクライブしているとします。

Copy
NSNotificationCenter.defaultCenter().addObserver(observer:self, selector:"didReceivePushSync:", name:"CognitoPushNotification", object:nil)

その場合は、次のように通知に応答できます。

Copy
func didReceivePushSync(notification: NSNotification) { if let data = (notification.object as! [String: AnyObject])["data"] as? [String: AnyObject] { let identityId = data["identityId"] as! String let datasetName = data["datasetName"] as! String if self.dataset.name == datasetName && self.identityId == identityId { dataset.synchronize().continueWithBlock {(task) -> AnyObject! in if task.error == nil { print("Successfully synced dataset") } return nil } } } }

プッシュ通知のペイロードでは、次のキーを利用できます。

  • source: cognito-sync。これは、通知間の差別化要素として機能します。

  • identityPoolId: ID プールの ID。これは検証や追加の情報用に使用できますが、レシーバーの観点からは不可欠ではありません。

  • identityId: プール内のアイデンティティ ID。

  • datasetName: 更新されたデータセットの名前。これは openOrCreateDataset 呼び出しの目的で利用できます。

  • syncCount: リモートデータセットの同期カウント。これは、ローカルデータセットが古くなっていないこと、および入力同期が新しいことを確認する方法として使用できます。