Implementación de la sincronización mediante inserción - Amazon Cognito

Implementación de la sincronización mediante inserción

Si es la primera vez que utiliza Amazon Cognito Sync, utilice AWS AppSync. Como Amazon Cognito Sync, AWS AppSync es un servicio destinado a sincronizar los datos de las aplicaciones entre dispositivos.

Con este, se pueden sincronizar los datos de usuarios, como las preferencias de aplicación o el estado del juego. También amplía estas funcionalidades, ya que permite que varios usuarios se sincronicen y colaboren en tiempo real sobre los datos compartidos.

Amazon Cognito realiza seguimiento de forma automática de la asociación entre la identidad y los dispositivos. El uso de la sincronización mediante inserción puede garantizar que todas las instancias de una determinada identidad reciban una notificación cuando cambien los datos de identidad. La sincronización por inserción garantiza que, siempre que los datos del almacén de sincronización cambien para una identidad determinada, todos los dispositivos asociados recibirán una notificación de inserción silenciosa que informe del cambio.

nota

La sincronización mediante inserción no es compatible con JavaScript, Unity o Xamarin.

Para poder utilizar la sincronización mediante inserción, primero debe configurar su cuenta para que se sincronice mediante inserción en la consola de Amazon Cognito.

Creación de una aplicación de Amazon Simple Notification Service (Amazon SNS)

Cree y configure una aplicación de Amazon SNS para sus plataformas compatibles, tal como se describe en la Guía para desarrolladores de SNS.

Activación de la sincronización mediante inserción en la consola de Amazon Cognito

Puede habilitar la sincronización mediante inserción mediante la consola de Amazon Cognito. En la página de inicio de la consola:

  1. Haga clic en el nombre del grupo de identidades para el que desea habilitar la sincronización por inserción. Se mostrará la página Dashboard (Panel) de su grupo de identidades.

  2. En la esquina superior derecha de la página Dashboard (Panel), haga clic en Manage Identity Pools (Administrar grupos de identidades). Se visualizará la página Federated Identities (Identidades federadas).

  3. Desplácese hacia abajo y haga clic en Push synchronization (Insertar sincronización) para expandirlo.

  4. En el menú desplegable Service role (Rol de servicio), seleccione el rol de IAM que concede a Cognito permiso para enviar una notificación de SNS. Haga clic en Create role (Crear rol) para crear o modificar los roles asociados a su grupo de identidades en la consola de IAM de AWS.

  5. Seleccione una aplicación de plataforma y, a continuación, haga clic en Save Changes (Guardar cambios).

  6. Autorice a SNS acceso a su aplicación

En la consola de AWS Identity and Access Management, configure los roles de IAM para que tengan pleno acceso de Amazon SNS o cree un rol nuevo que cuente con acceso completo de Amazon SNS. En el ejemplo siguiente de política de confianza de rol se concede a Amazon Cognito Sync una capacidad limitada para que adopte un rol de IAM. Amazon Cognito Sync solo puede adoptar el rol cuando lo hace en nombre del grupo de identidades en la condición aws:SourceArn y en la cuenta en la condición aws:SourceAccount.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cognito-sync.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "AWS:SourceAccount": "123456789012" }, "ArnLike": { "AWS:SourceArn": "arn:aws:cognito-identity:us-east-1:123456789012:identitypool/us-east-1:177a950c-2c08-43f0-9983-28727EXAMPLE" } } } ] }

Para obtener más información acerca de los roles de IAM, consulte la sección Roles (delegación y federación).

Uso de la sincronización mediante inserción en su aplicación: Android

Su aplicación deberá importar los servicios de Google Play. Puede descargar la versión más reciente del SDK de Google Play a través del administrador de SDK para Android. Consulte la documentación de Android que se encuentra en Android Implementation para registrar la aplicación y recibir un ID de registro de GCM. Una vez que tenga el ID de registro, deberá registrar el dispositivo con Amazon Cognito, tal como se muestra en el fragmento siguiente:

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); }

Ahora ya puede suscribir un dispositivo para recibir actualizaciones de un conjunto de datos determinado:

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); } }

Para dejar de recibir notificaciones de inserción desde un conjunto de datos, solo tiene que llamar al método unsubscribe. Para suscribirse a todos los conjuntos de datos (o a un subconjunto concreto) del objeto CognitoSyncManager, utilice subscribeAll():

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); } }

En la implementación del objeto Android BroadcastReceiver, puede comprobar la última versión del conjunto de datos modificado y decidir si su aplicación se debe volver a sincronizar:

@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() { // ... }); } }

Las claves siguientes están disponibles en la carga útil de notificaciones de inserción:

  • source: sincronización de Cognito. Esta clave puede servir de factor de diferenciación entre las notificaciones.

  • identityPoolId: ID del grupo de identidades. Esta clave se puede utilizar para la validación o para obtener información adicional, aunque desde el punto de vista del receptor no sea integral.

  • identityId: ID de identidad dentro del grupo.

  • datasetName: nombre del conjunto de datos que se ha actualizado. Esta clave está disponible para la llamada openOrCreateDataset.

  • syncCount: número de sincronizaciones para el conjunto de datos remoto. Puede utilizar esta clave como forma de asegurarse de que el conjunto de datos local esté obsoleto y que la sincronización de entrada sea nueva.

Uso de la sincronización mediante inserción en su aplicación: iOS - Objective-C

Para obtener un token de dispositivo para su aplicación, consulte la documentación de Apple en el registro para recibir notificaciones remotas. Una vez que haya recibido el token de dispositivo como objeto NSData desde APN, tendrá que registrar el dispositivo en Amazon Cognito con el método registerDevice: del cliente de sincronización, tal como se muestra a continuación:

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; } ];

En el modo de depuración, el dispositivo se registra en el entorno de pruebas de APN; mientras que en el modo de lanzamiento, se registra en los APN. Para recibir actualizaciones de un conjunto de datos determinado, aplique el método subscribe:

[[[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; } ];

Para dejar de recibir notificaciones de inserción desde un conjunto de datos, solo tiene que llamar al método unsubscribe:

[[[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; } ];

Para suscribirse a todos los conjuntos de datos del objeto AWSCognito, llame a subscribeAll:

[[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; } ];

Antes de llamar a subscribeAll, sincronice todos los conjuntos de datos como mínimo una vez, para que dichos conjuntos existan en el servidor.

Para responder a las notificaciones de inserción, debe implementar el método didReceiveRemoteNotification en el delgado de la aplicación:

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

Si publica una notificación mediante el controlador de notificaciones, puede responder a la notificación en cualquier punto de la aplicación donde tenga un control sobre el conjunto de datos. Si se suscribe a la notificación de esta forma...

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

... puede actuar sobre la notificación de esta forma:

- (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; }]; } }

Las claves siguientes están disponibles en la carga útil de notificaciones de inserción:

  • source: sincronización de Cognito. Esta clave puede servir de factor de diferenciación entre las notificaciones.

  • identityPoolId: ID del grupo de identidades. Esta clave se puede utilizar para la validación o para obtener información adicional, aunque desde el punto de vista del receptor no sea integral.

  • identityId: ID de identidad dentro del grupo.

  • datasetName: nombre del conjunto de datos que se ha actualizado. Esta clave está disponible para la llamada openOrCreateDataset.

  • syncCount: número de sincronizaciones para el conjunto de datos remoto. Puede utilizar esta clave como forma de asegurarse de que el conjunto de datos local esté obsoleto y que la sincronización de entrada sea nueva.

Uso de la sincronización mediante inserción en su aplicación: iOS - Swift

Para obtener un token de dispositivo para su aplicación, consulte la documentación de Apple en el registro para recibir notificaciones remotas. Una vez que haya recibido el token de dispositivo como objeto NSData desde APN, tendrá que registrar el dispositivo en Amazon Cognito con el método registerDevice: del cliente de sincronización, tal como se muestra a continuación:

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 })

En el modo de depuración, el dispositivo se registra en el entorno de pruebas de APN; mientras que en el modo de lanzamiento, se registra en los APN. Para recibir actualizaciones de un conjunto de datos determinado, aplique el método subscribe:

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 })

Para dejar de recibir notificaciones de inserción desde un conjunto de datos, llame al método unsubscribe:

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 })

Para suscribirse a todos los conjuntos de datos del objeto AWSCognito, llame a subscribeAll:

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 })

Antes de llamar a subscribeAll, sincronice todos los conjuntos de datos como mínimo una vez, para que dichos conjuntos existan en el servidor.

Para responder a las notificaciones de inserción, debe implementar el método didReceiveRemoteNotification en el delgado de la aplicación:

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

Si publica una notificación mediante el controlador de notificaciones, puede responder a la notificación en cualquier punto de la aplicación donde tenga un control sobre el conjunto de datos. Si se suscribe a la notificación de esta forma...

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

... puede actuar sobre la notificación de esta forma:

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 } } } }

Las claves siguientes están disponibles en la carga útil de notificaciones de inserción:

  • source: sincronización de Cognito. Esta clave puede servir de factor de diferenciación entre las notificaciones.

  • identityPoolId: ID del grupo de identidades. Esta clave se puede utilizar para la validación o para obtener información adicional, aunque desde el punto de vista del receptor no sea integral.

  • identityId: ID de identidad dentro del grupo.

  • datasetName: nombre del conjunto de datos que se ha actualizado. Esta clave está disponible para la llamada openOrCreateDataset.

  • syncCount: número de sincronizaciones para el conjunto de datos remoto. Puede utilizar esta clave como forma de asegurarse de que el conjunto de datos local esté obsoleto y que la sincronización de entrada sea nueva.