Sincronizzazione push - Amazon Cognito

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Sincronizzazione push

Se non hai mai usato Amazon Cognito Sync, utilizza AWS AppSync. Come Amazon Cognito Sync, AWS AppSync è un servizio che consente la sincronizzazione dei dati delle applicazioni tra più dispositivi.

Consente di sincronizzare i dati dell'utente come le preferenze dell'app o lo stato del gioco. Inoltre estende queste funzionalità consentendo a più utenti di sincronizzare e collaborare in tempo reale su dati condivisi.

Amazon Cognito monitora automaticamente l'associazione tra identità e dispositivi. L'uso della funzione della sincronizzazione push ti permette di assicurare che tutte le istanze di una determinata identità siano avvisate della modifica di alcuni dati di identità. La sincronizzazione push garantisce che, ogni volta che i dati dell'archivio di sincronizzazione cambiano per una determinata identità, tutti i dispositivi associati a tale identità ricevono una notifica push silenziosa che li informa delle modifiche.

Nota

La sincronizzazione push non è supportata per JavaScript, Unity o Xamarin.

Prima di poter utilizzare la sincronizzazione push, devi abilitarla nella console Amazon Cognito e configurare l'account per la sincronizzazione.

Creazione di un'app Amazon Simple Notification Service (Amazon SNS)

Crea e configura un'app Amazon SNS per la tua piattaforma supportata, come descritto nella Guida per gli sviluppatori di SNS.

Abilitazione della sincronizzazione push nella console di Amazon Cognito

Puoi abilitare la sincronizzazione push tramite la console Amazon Cognito. Dalla home page della console:

  1. Fai clic sul nome del pool di identità per cui desideri attivare la sincronizzazione push. Viene visualizzata la pagina Dashboard (Pannello di controllo) per il tuo pool di identità.

  2. Nell'angolo in alto a destra della pagina Dashboard (Pannello di controllo), fai clic su Manage Identity Pools (Gestisci pool di identità). Viene visualizzata la pagina Federated Identities (Identità federate).

  3. Scorri verso il basso e fai clic su Push synchronization (Sincronizzazione push) per ingrandire questa opzione.

  4. Nel menu a discesa Service role (Ruolo di servizio) seleziona il ruolo IAM che garantisce a Cognito l'autorizzazione per inviare una notifica SNS. Fai clic su Create role (Crea ruolo) per creare o modificare i ruoli associati al tuo pool di identità nella Console AWS IAM.

  5. Seleziona un'applicazione della piattaforma, quindi fai clic su Save Changes (Salva le modifiche).

  6. Concedi l'accesso SNS alla tua applicazione

Nella console AWS Identity and Access Management, configura i tuoi ruoli IAM per avere pieno accesso ad Amazon SNS, oppure crea un nuovo ruolo che abbia pieno accesso ad Amazon SNS. L'esempio seguente di policy di attendibilità dei ruoli garantisce ad Amazon Cognito Sync una capacità limitata di assumere un ruolo IAM. Amazon Cognito Sync può assumere il ruolo solo quando lo fa per conto sia del pool di identità nella condizione aws:SourceArn che dell'account nella condizione 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" } } } ] }

Per ulteriori informazioni sui ruoli IAM, consulta i Ruoli (Delega e Federazione).

Uso della sincronizzazione push nella tua app: Android

La tua e avrà bisogno di importare i servizi Google Play. Puoi scaricare la versione più recente di SDK di Google Play tramite il gestore SDK di Android. Segui la documentazione di Android suAndroid Implementation per registrare la tua app e ricevere un ID di registrazione da GCM. Una volta che hai ottenuto l'ID di registrazione, hai bisogno di registrare il dispositivo con Amazon Cognito come illustrato nel frammento che segue:

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

Ora puoi sottoscrivere un dispositivo per ricevere gli aggiornamenti provenienti da un determinato set di dati:

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

Per interrompere la ricezione di notifiche push da un set di dati, è sufficiente chiamare il metodo di annullamento. Per effettuare la sotttoscrizione a tutti i set di dati (o un sottoinsieme specifico) nell'oggetto CognitoSyncManager, usa 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); } }

Nella tua implementazione dell'oggetto di AndroidBroadcastReceiver, puoi verificare la versione più recente del set di dati modificati e decidere se la tua app deve sincronizzarsi di nuovo:

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

Le seguenti chiavi sono disponibili nel payload delle notifiche push:

  • source: cognito-sync. Questo può servire come un fattore di differenziazione tra le notifiche.

  • identityPoolId: ID pool di identità. Questo può essere utilizzato per la convalida o per informazioni aggiuntive, ma non è integrante dal punto di vista del ricevitore.

  • identityId: ID identità all'interno del pool.

  • datasetName: Nome del set di dati che è stato aggiornato. Questo è disponibile per la sicurezza della chiamata openOrCreateDataset.

  • syncCount: Numero di sincronizzazione per il set di dati remoto. Puoi usare questo come un modo per assicurarti che il set di dati locali sia obsoleto e che la sincronizzazione in entrata sia nuova.

Uso della sincronizzazione push nella tua app: iOS - Objective-C

Per ottenere un token di dispositivo per la tua app, segui la documentazione Apple sulla Registrazione per notifiche remote. Una volta che hai ricevuto il token di dispositivo come un oggetto NSData dagli APN, è necessario registrare il dispositivo con Amazon Cognito utilizzando il metodo registerDevice: del client di sincronizzazione, come illustrato di seguito:

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

In modalità di debug, il tuo dispositivo registrerà con il sandbox degli APN; in modalità di rilascio, registrerà con gli APN. Per ricevere aggiornamenti da un particolare set di dati, usa il metodo 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; } ];

Per interrompere la ricezione di notifiche push da un set di dati, è sufficiente chiamare il metodo 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; } ];

Per effettuare la sottoscrizione a tutti i set di dati nell'oggetto AWSCognito, chiama 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; } ];

Prima di chiamare subscribeAll, assicurati di sincronizzare tutti i set di dati almeno una volta, in modo tale che gli stessi set di dati esistano nel server.

Per rispondere alle notifiche push, hai bisogno di implementare il metodo didReceiveRemoteNotification nel tuo delegato dell'app:

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

Se pubblichi una notizia tramite il gestore delle notifiche, puoi quindi rispondere alla notifica in qualsiasi punto dell'applicazione in cui disponi di un gestore per il set di dati. Se effettui la sottoscrizione alla notifica in questo modo ...

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

... puoi intervenire sulla notifica in questo modo:

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

Le seguenti chiavi sono disponibili nel payload delle notifiche push:

  • source: cognito-sync. Questo può servire come un fattore di differenziazione tra le notifiche.

  • identityPoolId: ID pool di identità. Questo può essere utilizzato per la convalida o per informazioni aggiuntive, ma non è integrante dal punto di vista del ricevitore.

  • identityId: ID identità all'interno del pool.

  • datasetName: Nome del set di dati che è stato aggiornato. Questo è disponibile per la sicurezza della chiamata openOrCreateDataset.

  • syncCount: Numero di sincronizzazione per il set di dati remoto. Puoi usare questo come un modo per assicurarti che il set di dati locali sia obsoleto e che la sincronizzazione in entrata sia nuova.

Uso della sincronizzazione push nella tua app: iOS - Swift

Per ottenere un token di dispositivo per la tua app, segui la documentazione Apple sulla Registrazione per notifiche remote. Una volta che hai ricevuto il token di dispositivo come un oggetto NSData dagli APN, è necessario registrare il dispositivo con Amazon Cognito utilizzando il registerDevice: del client di sincronizzazione, come illustrato di seguito:

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

In modalità di debug, il tuo dispositivo registrerà con il sandbox degli APN; in modalità di rilascio, registrerà con gli APN. Per ricevere aggiornamenti da un particolare set di dati, usa il metodo 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 })

Per interrompere la ricezione di notifiche push da un set di dati, chiama il metodo 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 })

Per effettuare la sottoscrizione a tutti i set di dati nell'oggetto AWSCognito, chiama 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 })

Prima di chiamare subscribeAll, assicurati di sincronizzare tutti i set di dati almeno una volta, in modo tale che gli stessi set di dati esistano nel server.

Per rispondere alle notifiche push, hai bisogno di implementare il metodo didReceiveRemoteNotification nel tuo delegato dell'app:

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

Se pubblichi una notizia tramite il gestore delle notifiche, puoi quindi rispondere alla notifica in qualsiasi punto dell'applicazione in cui disponi di un gestore per il set di dati. Se effettui la sottoscrizione alla notifica in questo modo ...

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

... puoi intervenire sulla notifica in questo modo:

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

Le seguenti chiavi sono disponibili nel payload delle notifiche push:

  • source: cognito-sync. Questo può servire come un fattore di differenziazione tra le notifiche.

  • identityPoolId: ID pool di identità. Questo può essere utilizzato per la convalida o per informazioni aggiuntive, ma non è integrante dal punto di vista del ricevitore.

  • identityId: ID identità all'interno del pool.

  • datasetName: Nome del set di dati che è stato aggiornato. Questo è disponibile per la sicurezza della chiamata openOrCreateDataset.

  • syncCount: Numero di sincronizzazione per il set di dati remoto. Puoi usare questo come un modo per assicurarti che il set di dati locali sia obsoleto e che la sincronizzazione in entrata sia nuova.