イベントコールバックの処理 - Amazon Cognito

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

イベントコールバックの処理

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

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

Amazon Cognito Sync デベロッパーとして、さまざまなコールバックを実装して、さまざまな同期イベントやシナリオを処理できます。Android のSyncCallbackインターフェイスは、データセットが正常にダウンロードされたonSuccess()とき、例外が発生したonFailure()とき、ローカルデータとリモートデータ間の競合を解決onConflict()するために、データセットの同期に関する通知SDKを設定します。

iOS ではSDK、 のような同様の通知に登録AWSCognitoDidStartSynchronizeNotificationし、 のようなハンドラーを設定AWSCognitoRecordConflictHandlerして競合を解決できます。 JavaScript、Unity、Xamarin プラットフォームには、同様のコールバックメカニズムがあります。これらのコールバックを実装すると、アプリケーションは Amazon Cognito Sync の使用時に発生する可能性のあるさまざまな同期イベントやシナリオを正常に処理できます。

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 インターフェイスを使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。ローカルデータの処理SDKをクライアントに伝えるonDatasetDeleted()方法を実装します。

@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 オブジェクトが含まれます。を使用すると、ローカルレコード: [conflict resolveWithLocalRecord]、リモートレコード: [conflict resolveWithRemoteRecord]、またはまったく新しい値: [conflict resolveWithValue:value] との競合を解決 AWSCognitoConflict できます。このメソッドから 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 オブジェクトが含まれています。を使用すると、ローカルレコード: [conflict resolveWithLocalRecord]、リモートレコード: [conflict resolveWithRemoteRecord]、またはまったく新しい値: [conflict resolveWithValue:value] との競合を解決AWSCognitoConflictできます。このメソッドから 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; }