Implementación de la sincronización push - Amazon Cognito

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Implementación de la sincronización push

Si es la primera vez que utiliza Amazon Cognito Sync, utilice AWS AppSync. Al igual que Amazon Cognito Sync, AWS AppSync es un servicio para 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 automática no es compatible con Unity ni Xamarin. JavaScript

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.

Crear una aplicación Amazon Simple Notification Service (AmazonSNS)

Crea y configura una SNS aplicación de Amazon para las plataformas compatibles, tal y como se describe en la Guía para SNS desarrolladores.

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 Función de servicio, seleccione la IAM función que concede permiso a Cognito para enviar SNS una notificación. Haga clic en Crear rol para crear o modificar los roles asociados a su grupo de identidades en la AWS IAM consola.

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

  6. Conceda SNS acceso a su aplicación

En la AWS Identity and Access Management consola, configura tus IAM funciones para tener SNS acceso total a Amazon o crea una nueva función que tenga SNS acceso total a Amazon. El siguiente ejemplo de política de confianza de roles otorga a Amazon Cognito Sync una capacidad limitada para asumir un IAM rol. 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 sobre IAM los roles, consulte 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. Puedes descargar la última versión de Google Play SDK a través del SDKadministrador de Android. Sigue la documentación de Android sobre la implementación de Android para registrar tu aplicación y recibir un ID de registroGCM. 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 tu implementación del BroadcastReceiver objeto de Android, puedes comprobar la versión más reciente del conjunto de datos modificado y decidir si tu aplicación necesita volver a sincronizarse:

@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. Esto está disponible por el simple hecho de llamar al openOrCreate conjunto de datos.

  • 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 del dispositivo como NSData objetoAPNs, tendrá que registrar el dispositivo en Amazon Cognito mediante el registerDevice: método del cliente de sincronización, 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 registrará en el APNs entorno aislado; en el modo de lanzamiento, se registrará con. APNs 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 del dispositivo como NSData objetoAPNs, tendrá que registrar el dispositivo en Amazon Cognito mediante el métodoregisterDevice: del cliente de sincronización, 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 registrará en el APNs entorno aislado; en el modo de lanzamiento, se registrará con. APNs 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.