コールバックの処理 - Amazon Cognito

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

コールバックの処理

Amazon Cognito Sync を初めて使用する場合は、AWS AppSync を使用してください。Amazon Cognito Sync と同様に、AWS AppSync はデバイス間でアプリケーションデータを同期化するためのサービスです。

このサービスは、アプリの設定やゲームステートといったユーザーデータの同期化を可能にします。また、複数のユーザーが同期し、共有されたデータでリアルタイムにコラボレートできるようにすることで、これらの機能を拡張します。

このセクションでは、コールバックを処理する方法について説明します。

Android

SyncCallback インターフェイス

SyncCallback インターフェイスを実装することで、データセットの同期に関するアプリの通知を受け取ることができます。これによりアプリは、ローカルデータの削除、認証されていないプロファイルや認証されたプロファイルの結合、同期の競合の解決に関するアクティブな決定ができます。インターフェイスで必要となる次のメソッドを実装する必要があります。

  • onSuccess()

  • onFailure()

  • onConflict()

  • onDatasetDeleted()

  • onDatasetsMerged()

すべてのコールバックを指定しない場合は、すべてのコールバックに対して空のデフォルト実装を提供する、DefaultSyncCallback クラスを使用することもできます。

onSuccess

onSuccess() コールバックは、同期ストアから正常にデータセットをダウンロードしたときにトリガーされます。

@Override public void onSuccess(Dataset dataset, List<Record> newRecords) { }

onFailure

onFailure() は、同期中に例外が発生した場合に呼び出されます。

@Override public void onFailure(DataStorageException dse) { }

onConflict

ローカルストアと同期ストアで同じキーが変更された場合に、競合が発生する可能性があります。onConflict() メソッドは、競合の解決を処理します。このメソッドを実装しない場合、Amazon Cognito Sync クライアントはデフォルトで最新の変更を使用します。

@Override public boolean onConflict(Dataset dataset, final List<SyncConflict> conflicts) { List<Record> resolvedRecords = new ArrayList<Record>(); for (SyncConflict conflict : conflicts) { /* resolved by taking remote records */ resolvedRecords.add(conflict.resolveWithRemoteRecord()); /* alternately take the local records */ // resolvedRecords.add(conflict.resolveWithLocalRecord()); /* or customer logic, say concatenate strings */ // String newValue = conflict.getRemoteRecord().getValue() // + conflict.getLocalRecord().getValue(); // resolvedRecords.add(conflict.resolveWithValue(newValue); } dataset.resolve(resolvedRecords); // return true so that synchronize() is retried after conflicts are resolved return true; }

onDatasetDeleted

データセットが削除されると、Amazon Cognito クライアントは SyncCallback インターフェイスを使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。onDatasetDeleted() メソッドを実装して、クライアント SDK にローカルデータの処理方法を指定します。

@Override public boolean onDatasetDeleted(Dataset dataset, String datasetName) { // return true to delete the local copy of the dataset return true; }

onDatasetMerged

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、onDatasetsMerged() メソッドを通じて結合について通知されます。

@Override public boolean onDatasetsMerged(Dataset dataset, List<String> datasetNames) { // return false to handle Dataset merge outside the synchronization callback return false; }

iOS - Objective-C

同期の通知

Amazon Cognito クライアントは、同期コール中に多数の NSNotification イベントを生成します。標準の NSNotificationCenter を通じて、これらの通知をモニタリングするよう登録できます。

[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myNotificationHandler:) name:NOTIFICATION_TYPE object:nil];

Amazon Cognito は、以下にリストされている 5 つの通知タイプをサポートします。

AWSCognitoDidStartSynchronizeNotification

同期操作の開始中に呼び出されます。userInfo は、同期されているデータセットの名前であるキーデータセットを含みます。

AWSCognitoDidEndSynchronizeNotification

同期操作が完了した (正常またはその反対) ときに呼び出されます。userInfo は、同期されているデータセットの名前であるキーデータセットを含みます。

AWSCognitoDidFailToSynchronizeNotification

同期操作が失敗すると呼び出されます。userInfo は、同期されているデータセットの名前であるキーデータセットと、失敗の原因となったエラーを含むキーエラーを含みます。

AWSCognitoDidChangeRemoteValueNotification

ローカル変更が Amazon Cognito に正常にプッシュされたときに呼び出されます。userInfo は、同期されているデータセットの名前であるキーデータセットと、プッシュされたレコードキーの NSArray を含むキーを含みます。

AWSCognitoDidChangeLocalValueFromRemoteNotification

ローカルの値が同期操作が原因で変更されたときに呼び出されます。userInfo は、同期されているデータセットの名前であるキーデータセットと、変更されたレコードキーの NSArray を含むキーを含みます。

競合解決ハンドラ

同期操作中に、ローカルストアと同期ストアで同じキーが変更された場合、競合が発生する可能性があります。競合解決ハンドラを設定していない場合、Amazon Cognito はデフォルトで最新の更新を選択します。

AWSCognitoRecordConflictHandler を実装して割り当てることで、デフォルトの競合解決は変更できます。AWSCognitoConflict 入力パラメータには、ローカルにキャッシュされたデータと、同期ストアの競合するレコードの両方の AWSCognitoRecord オブジェクトが含まれています。AWSCognitoConflict を使用すると、ローカルレコード [conflict resolveWithLocalRecord]、リモートレコード [conflict resolveWithRemoteRecord]、またはまったく新しい値 [conflict resolveWithValue:value] との競合を解決できます。このメソッドから nil が返されると、同期は続行できなくなり、次回に同期処理が開始されると、競合が再び発生します。

クライアントレベルで競合解決ハンドラを設定できます。

client.conflictHandler = ^AWSCognitoResolvedConflict* (NSString *datasetName, AWSCognitoConflict *conflict) { // always choose local changes return [conflict resolveWithLocalRecord]; };

または、データセットレベルで設定できます。

dataset.conflictHandler = ^AWSCognitoResolvedConflict* (NSString *datasetName, AWSCognitoConflict *conflict) { // override and always choose remote changes return [conflict resolveWithRemoteRecord]; };

データセットが削除されたハンドラ

データセットが削除されると、Amazon Cognito クライアントは AWSCognitoDatasetDeletedHandler を使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。AWSCognitoDatasetDeletedHandler が実装されていない場合、ローカルデータは自動的に消去されます。消去する前にローカルデータのコピーを維持するか、ローカルデータを維持する場合は、AWSCognitoDatasetDeletedHandler を実装します。

クライアントレベルでデータセットが削除されたハンドラを設定することができます。

client.datasetDeletedHandler = ^BOOL (NSString *datasetName) { // make a backup of the data if you choose ... // delete the local data (default behavior) return YES; };

または、データセットレベルで設定できます。

dataset.datasetDeletedHandler = ^BOOL (NSString *datasetName) { // override default and keep the local data return NO; };

データセットの結合ハンドラ

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、DatasetMergeHandler メソッドを通じて結合について通知されます。ハンドラは、ルートデータセットの名前と、ルートデータセットの結合としてマーキングされているデータセット名の配列を受け取ります。

DatasetMergeHandler が実装されていない場合、これらのデータセットは無視されますが、ID の最大 20 個の合計データセットで引き続き領域を占有します。

クライアントレベルでデータセット結合ハンドラをセットアップすることもできます。

client.datasetMergedHandler = ^(NSString *datasetName, NSArray *datasets) { // Blindly delete the datasets for (NSString *name in datasets) { AWSCognitoDataset *merged = [[AWSCognito defaultCognito] openOrCreateDataset:name]; [merged clear]; [merged synchronize]; } };

または、データセットレベルで設定できます。

dataset.datasetMergedHandler = ^(NSString *datasetName, NSArray *datasets) { // Blindly delete the datasets for (NSString *name in datasets) { AWSCognitoDataset *merged = [[AWSCognito defaultCognito] openOrCreateDataset:name]; // do something with the data if it differs from existing dataset ... // now delete it [merged clear]; [merged synchronize]; } };

iOS - Swift

同期の通知

Amazon Cognito クライアントは、同期コール中に多数の NSNotification イベントを生成します。標準の NSNotificationCenter を通じて、これらの通知をモニタリングするよう登録できます。

NSNotificationCenter.defaultCenter().addObserver(observer: self, selector: "myNotificationHandler", name:NOTIFICATION_TYPE, object:nil)

Amazon Cognito は、以下にリストされている 5 つの通知タイプをサポートします。

AWSCognitoDidStartSynchronizeNotification

同期操作の開始中に呼び出されます。userInfo は、同期されているデータセットの名前であるキーデータセットを含みます。

AWSCognitoDidEndSynchronizeNotification

同期操作が完了した (正常またはその反対) ときに呼び出されます。userInfo は、同期されているデータセットの名前であるキーデータセットを含みます。

AWSCognitoDidFailToSynchronizeNotification

同期操作が失敗すると呼び出されます。userInfo は、同期されているデータセットの名前であるキーデータセットと、失敗の原因となったエラーを含むキーエラーを含みます。

AWSCognitoDidChangeRemoteValueNotification

ローカル変更が Amazon Cognito に正常にプッシュされたときに呼び出されます。userInfo は、同期されているデータセットの名前であるキーデータセットと、プッシュされたレコードキーの NSArray を含むキーを含みます。

AWSCognitoDidChangeLocalValueFromRemoteNotification

ローカルの値が同期操作が原因で変更されたときに呼び出されます。userInfo は、同期されているデータセットの名前であるキーデータセットと、変更されたレコードキーの NSArray を含むキーを含みます。

競合解決ハンドラ

同期操作中に、ローカルストアと同期ストアで同じキーが変更された場合、競合が発生する可能性があります。競合解決ハンドラを設定していない場合、Amazon Cognito はデフォルトで最新の更新を選択します。

AWSCognitoRecordConflictHandler を実装して割り当てることで、デフォルトの競合解決は変更できます。AWSCognitoConflict 入力パラメータには、ローカルにキャッシュされたデータと、同期ストアの競合するレコードの両方の AWSCognitoRecord オブジェクトが含まれています。AWSCognitoConflict を使用すると、ローカルレコード [conflict resolveWithLocalRecord]、リモートレコード [conflict resolveWithRemoteRecord]、またはまったく新しい値 [conflict resolveWithValue:value] との競合を解決できます。このメソッドから nil が返されると、同期は続行できなくなり、次回に同期処理が開始されると、競合が再び発生します。

クライアントレベルで競合解決ハンドラを設定できます。

client.conflictHandler = { (datasetName: String?, conflict: AWSCognitoConflict?) -> AWSCognitoResolvedConflict? in return conflict.resolveWithLocalRecord() }

または、データセットレベルで設定できます。

dataset.conflictHandler = { (datasetName: String?, conflict: AWSCognitoConflict?) -> AWSCognitoResolvedConflict? in return conflict.resolveWithLocalRecord() }

データセットが削除されたハンドラ

データセットが削除されると、Amazon Cognito クライアントは AWSCognitoDatasetDeletedHandler を使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。AWSCognitoDatasetDeletedHandler が実装されていない場合、ローカルデータは自動的に消去されます。消去する前にローカルデータのコピーを維持するか、ローカルデータを維持する場合は、AWSCognitoDatasetDeletedHandler を実装します。

クライアントレベルでデータセットが削除されたハンドラを設定することができます。

client.datasetDeletedHandler = { (datasetName: String!) -> Bool in // make a backup of the data if you choose ... // delete the local data (default behaviour) return true }

または、データセットレベルで設定できます。

dataset.datasetDeletedHandler = { (datasetName: String!) -> Bool in // make a backup of the data if you choose ... // delete the local data (default behaviour) return true }

データセットの結合ハンドラ

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、DatasetMergeHandler メソッドを通じて結合について通知されます。ハンドラは、ルートデータセットの名前と、ルートデータセットの結合としてマーキングされているデータセット名の配列を受け取ります。

DatasetMergeHandler が実装されていない場合、これらのデータセットは無視されますが、ID の最大 20 個の合計データセットで引き続き領域を占有します。

クライアントレベルでデータセット結合ハンドラをセットアップすることもできます。

client.datasetMergedHandler = { (datasetName: String!, datasets: [AnyObject]!) -> Void in for nameObject in datasets { if let name = nameObject as? String { let merged = AWSCognito.defaultCognito().openOrCreateDataset(name) merged.clear() merged.synchronize() } } }

または、データセットレベルで設定できます。

dataset.datasetMergedHandler = { (datasetName: String!, datasets: [AnyObject]!) -> Void in for nameObject in datasets { if let name = nameObject as? String { let merged = AWSCognito.defaultCognito().openOrCreateDataset(name) // do something with the data if it differs from existing dataset ... // now delete it merged.clear() merged.synchronize() } } }

JavaScript

同期のコールバック

データセットで synchronize() を実行するときに、オプションで次の各状態を処理するコールバックを指定できます。

dataset.synchronize({ onSuccess: function(dataset, newRecords) { //... }, onFailure: function(err) { //... }, onConflict: function(dataset, conflicts, callback) { //... }, onDatasetDeleted: function(dataset, datasetName, callback) { //... }, onDatasetMerged: function(dataset, datasetNames, callback) { //... } });

onSuccess()

onSuccess() コールバックは、同期ストアから正常にデータセットを更新したときにトリガーされます。コールバックを定義しない場合、同期はユーザーの操作なしに成功します。

onSuccess: function(dataset, newRecords) { console.log('Successfully synchronized ' + newRecords.length + ' new records.'); }

onFailure()

onFailure()は、同期中に例外が発生した場合に呼び出されます。コールバックを定義しない場合、同期はユーザーの操作なしに失敗します。

onFailure: function(err) { console.log('Synchronization failed.'); console.log(err); }

onConflict()

ローカルストアと同期ストアで同じキーが変更された場合に、競合が発生する可能性があります。onConflict() メソッドは、競合の解決を処理します。このメソッドを実行しない場合、競合があると同期は破棄されます。

onConflict: function(dataset, conflicts, callback) { var resolved = []; for (var i=0; i<conflicts.length; i++) { // Take remote version. resolved.push(conflicts[i].resolveWithRemoteRecord()); // Or... take local version. // resolved.push(conflicts[i].resolveWithLocalRecord()); // Or... use custom logic. // var newValue = conflicts[i].getRemoteRecord().getValue() + conflicts[i].getLocalRecord().getValue(); // resolved.push(conflicts[i].resovleWithValue(newValue); } dataset.resolve(resolved, function() { return callback(true); }); // Or... callback false to stop the synchronization process. // return callback(false); }

onDatasetDeleted()

データセットが削除されると、Amazon Cognito クライアントは onDatasetDeleted() コールバックを使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。デフォルトでは、データセットは削除されません。

onDatasetDeleted: function(dataset, datasetName, callback) { // Return true to delete the local copy of the dataset. // Return false to handle deleted datasets outside the synchronization callback. return callback(true); }

onDatasetMerged()

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、onDatasetsMerged() コールバックを通じて結合について通知されます。

onDatasetMerged: function(dataset, datasetNames, callback) { // Return true to continue the synchronization process. // Return false to handle dataset merges outside the synchronization callback. return callback(false); }

Unity

データセットを開くか作成した後は、別のコールバックを設定できます。これは、Synchronize メソッドを使用したときにトリガーされます。この方法により、コールバックを登録することができます。

dataset.OnSyncSuccess += this.HandleSyncSuccess; dataset.OnSyncFailure += this.HandleSyncFailure; dataset.OnSyncConflict = this.HandleSyncConflict; dataset.OnDatasetMerged = this.HandleDatasetMerged; dataset.OnDatasetDeleted = this.HandleDatasetDeleted;

SyncSuccessSyncFailure は、+= を = の代わりに使用し、複数のコールバックをサブスクライブできるようにします。

OnSyncSuccess

OnSyncSuccess コールバックは、クラウドから正常にデータセットを更新したときにトリガーされます。コールバックを定義しない場合、同期はユーザーの操作なしに成功します。

private void HandleSyncSuccess(object sender, SyncSuccessEvent e) { // Continue with your game flow, display the loaded data, etc. }

OnSyncFailure

OnSyncFailureは、同期中に例外が発生した場合に呼び出されます。コールバックを定義しない場合、同期はユーザーの操作なしに失敗します。

private void HandleSyncFailure(object sender, SyncFailureEvent e) { Dataset dataset = sender as Dataset; if (dataset.Metadata != null) { Debug.Log("Sync failed for dataset : " + dataset.Metadata.DatasetName); } else { Debug.Log("Sync failed"); } // Handle the error Debug.LogException(e.Exception); }

OnSyncConflict

ローカルストアと同期ストアで同じキーが変更された場合に、競合が発生する可能性があります。OnSyncConflict コールバックは競合の解決を処理します。このメソッドを実行しない場合、競合があると同期は破棄されます。

private bool HandleSyncConflict(Dataset dataset, List < SyncConflict > conflicts) { if (dataset.Metadata != null) { Debug.LogWarning("Sync conflict " + dataset.Metadata.DatasetName); } else { Debug.LogWarning("Sync conflict"); } List < Amazon.CognitoSync.SyncManager.Record > resolvedRecords = new List < Amazon.CognitoSync.SyncManager.Record > (); foreach(SyncConflict conflictRecord in conflicts) { // SyncManager provides the following default conflict resolution methods: // ResolveWithRemoteRecord - overwrites the local with remote records // ResolveWithLocalRecord - overwrites the remote with local records // ResolveWithValue - to implement your own logic resolvedRecords.Add(conflictRecord.ResolveWithRemoteRecord()); } // resolves the conflicts in local storage dataset.Resolve(resolvedRecords); // on return true the synchronize operation continues where it left, // returning false cancels the synchronize operation return true; }

OnDatasetDeleted

データセットが削除されると、Amazon Cognito クライアントは OnDatasetDeleted コールバックを使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。デフォルトでは、データセットは削除されません。

private bool HandleDatasetDeleted(Dataset dataset) { Debug.Log(dataset.Metadata.DatasetName + " Dataset has been deleted"); // Do clean up if necessary // returning true informs the corresponding dataset can be purged in the local storage and return false retains the local dataset return true; }

OnDatasetMerged

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、OnDatasetsMerged コールバックを通じて結合について通知されます。

public bool HandleDatasetMerged(Dataset localDataset, List<string> mergedDatasetNames) { foreach (string name in mergedDatasetNames) { Dataset mergedDataset = syncManager.OpenOrCreateDataset(name); //Lambda function to delete the dataset after fetching it EventHandler<SyncSuccessEvent> lambda; lambda = (object sender, SyncSuccessEvent e) => { ICollection<string> existingValues = localDataset.GetAll().Values; ICollection<string> newValues = mergedDataset.GetAll().Values; //Implement your merge logic here mergedDataset.Delete(); //Delete the dataset locally mergedDataset.OnSyncSuccess -= lambda; //We don't want this callback to be fired again mergedDataset.OnSyncSuccess += (object s2, SyncSuccessEvent e2) => { localDataset.Synchronize(); //Continue the sync operation that was interrupted by the merge }; mergedDataset.Synchronize(); //Synchronize it as deleted, failing to do so will leave us in an inconsistent state }; mergedDataset.OnSyncSuccess += lambda; mergedDataset.Synchronize(); //Asnchronously fetch the dataset } // returning true allows the Synchronize to continue and false stops it return false; }

Xamarin

データセットを開くか作成した後は、別のコールバックを設定できます。これは、Synchronize メソッドを使用したときにトリガーされます。この方法により、コールバックを登録することができます。

dataset.OnSyncSuccess += this.HandleSyncSuccess; dataset.OnSyncFailure += this.HandleSyncFailure; dataset.OnSyncConflict = this.HandleSyncConflict; dataset.OnDatasetMerged = this.HandleDatasetMerged; dataset.OnDatasetDeleted = this.HandleDatasetDeleted;

SyncSuccessSyncFailure は、+= を = の代わりに使用し、複数のコールバックをサブスクライブできるようにします。

OnSyncSuccess

OnSyncSuccess コールバックは、クラウドから正常にデータセットを更新したときにトリガーされます。コールバックを定義しない場合、同期はユーザーの操作なしに成功します。

private void HandleSyncSuccess(object sender, SyncSuccessEventArgs e) { // Continue with your game flow, display the loaded data, etc. }

OnSyncFailure

OnSyncFailureは、同期中に例外が発生した場合に呼び出されます。コールバックを定義しない場合、同期はユーザーの操作なしに失敗します。

private void HandleSyncFailure(object sender, SyncFailureEventArgs e) { Dataset dataset = sender as Dataset; if (dataset.Metadata != null) { Console.WriteLine("Sync failed for dataset : " + dataset.Metadata.DatasetName); } else { Console.WriteLine("Sync failed"); } }

OnSyncConflict

ローカルストアと同期ストアで同じキーが変更された場合に、競合が発生する可能性があります。OnSyncConflict コールバックは競合の解決を処理します。このメソッドを実行しない場合、競合があると同期は破棄されます。

private bool HandleSyncConflict(Dataset dataset, List < SyncConflict > conflicts) { if (dataset.Metadata != null) { Console.WriteLine("Sync conflict " + dataset.Metadata.DatasetName); } else { Console.WriteLine("Sync conflict"); } List < Amazon.CognitoSync.SyncManager.Record > resolvedRecords = new List < Amazon.CognitoSync.SyncManager.Record > (); foreach(SyncConflict conflictRecord in conflicts) { // SyncManager provides the following default conflict resolution methods: // ResolveWithRemoteRecord - overwrites the local with remote records // ResolveWithLocalRecord - overwrites the remote with local records // ResolveWithValue - to implement your own logic resolvedRecords.Add(conflictRecord.ResolveWithRemoteRecord()); } // resolves the conflicts in local storage dataset.Resolve(resolvedRecords); // on return true the synchronize operation continues where it left, // returning false cancels the synchronize operation return true; }

OnDatasetDeleted

データセットが削除されると、Amazon Cognito クライアントは OnDatasetDeleted コールバックを使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。デフォルトでは、データセットは削除されません。

private bool HandleDatasetDeleted(Dataset dataset) { Console.WriteLine(dataset.Metadata.DatasetName + " Dataset has been deleted"); // Do clean up if necessary // returning true informs the corresponding dataset can be purged in the local storage and return false retains the local dataset return true; }

OnDatasetMerged

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、OnDatasetsMerged コールバックを通じて結合について通知されます。

public bool HandleDatasetMerged(Dataset localDataset, List<string> mergedDatasetNames) { foreach (string name in mergedDatasetNames) { Dataset mergedDataset = syncManager.OpenOrCreateDataset(name); //Implement your merge logic here mergedDataset.OnSyncSuccess += lambda; mergedDataset.SynchronizeAsync(); //Asnchronously fetch the dataset } // returning true allows the Synchronize to continue and false stops it return false; }