0

J'essaie d'utiliser Amazon Cognito Sync pour stocker et récupérer à distance des informations sur mon utilisateur, et pour que ces informations soient synchronisées dans tous périphériques sur lesquels cet utilisateur est connecté.Amazon Cognito Push Sync Utilisation de la Messagerie Google Log In et Firebase Cloud: échec de l'abonnement au dataset

Je suis le tutoriel here qui montre comment créer des objets Dataset et comment utiliser ses méthodes get(), put() et synchronize(). Après avoir obtenu ce fonctionnement, j'ai essayé de suivre le tutoriel here qui montre comment enregistrer un périphérique pour les notifications push et subséquemment s'abonner à un jeu de données que vous souhaitez synchroniser. Cependant, quand je l'appelle

cognitoSyncManager.subscribeAll() 

Je reçois l'exception suivante:

com.amazonaws.mobileconnectors.cognito.exceptions.SubscribeFailedException: Failed to subscribe to dataset 
    at com.amazonaws.mobileconnectors.cognito.internal.storage.CognitoSyncStorage.subscribeToDataset(CognitoSyncStorage.java:360) 
    at com.amazonaws.mobileconnectors.cognito.DefaultDataset.subscribe(DefaultDataset.java:604) 
    at com.amazonaws.mobileconnectors.cognito.CognitoSyncManager.subscribe(CognitoSyncManager.java:332) 
    at com.amazonaws.mobileconnectors.cognito.CognitoSyncManager.subscribeAll(CognitoSyncManager.java:319) 
Caused by: com.amazonaws.services.cognitosync.model.ResourceNotFoundException: Failed to subscribe to dataset USER_INFORMATION, endpointArns do not exist (Service: AmazonCognitoSync; Status Code: 404; Error Code: ResourceNotFoundException; Request ID: 7e681e01-a872-11e7-9e5f-01c7f0419773) 
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:712) 
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:388) 
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:199) 
    at com.amazonaws.services.cognitosync.AmazonCognitoSyncClient.invoke(AmazonCognitoSyncClient.java:864) 
    at com.amazonaws.services.cognitosync.AmazonCognitoSyncClient.subscribeToDataset(AmazonCognitoSyncClient.java:663) 
    at com.amazonaws.mobileconnectors.cognito.internal.storage.CognitoSyncStorage.subscribeToDataset(CognitoSyncStorage.java:357) 
    at com.amazonaws.mobileconnectors.cognito.DefaultDataset.subscribe(DefaultDataset.java:604)  
    at com.amazonaws.mobileconnectors.cognito.CognitoSyncManager.subscribe(CognitoSyncManager.java:332)  
    at com.amazonaws.mobileconnectors.cognito.CognitoSyncManager.subscribeAll(CognitoSyncManager.java:319)  

Dans mon application Android, je suis authentification de l'utilisateur en utilisant Google Sign-In, ce qui me donne le jeton que j'ai besoin Lors de la création de Cognito Credentials Provider, j'utilise Firebase Cloud Messaging pour obtenir le jeton requis par Cognito Sync Manager. Voici l'extrait de mon code qui entraîne les exceptions:

new Thread(new Runnable() 
{ 
    @Override public void run() 
    { 
     CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(getContext(), Utilities.getString(R.string.aws_cognito_identity_pool_id), Regions.US_EAST_1); 

     Map<String, String> loginsMap = new HashMap<>(); 

     loginsMap.put("accounts.google.com", GoogleLoginManager.getInstance().getToken()); 

     credentialsProvider.setLogins(loginsMap); 

     credentialsProvider.refresh(); 

     cognitoId = credentialsProvider.getIdentityId(); 

     isLoggedIn = !cognitoId.equals(""); 

     if(isLoggedIn) 
     { 
      CognitoSyncManager cognitoSyncManager = new CognitoSyncManager(getContext(), Regions.US_EAST_1, credentialsProvider); 

      try 
      { 
       cognitoSyncManager.registerDevice("GCM", FirebaseInstanceId.getInstance().getId()); 
      } 
      catch(RegistrationFailedException exception) 
      { 
       Log.e(exception); 
      } 
      catch(AmazonClientException exception) 
      { 
       Log.e(exception); 
      } 

      if(cognitoSyncManager.isDeviceRegistered()) 
      { 
       try 
       { 
        cognitoSyncManager.subscribeAll(); 
       } 
       catch(SubscribeFailedException exception) 
       { 
        Log.e(exception); 
       } 
       catch(AmazonClientException exception) 
       { 
        Log.e(exception); 
       } 
      } 
     } 
    } 
}).start(); 

Une idée de ce que je fais mal? Suivre les tutoriels et naviguer dans la console des développeurs a été une énigme pour moi, et je pense qu'il doit y avoir un concept de base que je ne reçois pas.

Répondre

0

J'ai finalement compris. Lors de l'appel cognitoSyncManager.registerDevice() je passais FirebaseInstanceId.getInstance().getId() comme le jeton au lieu de FirebaseInstanceId.getInstance().getToken(). Bleh.

Aussi, avant d'appeler le cognitoSyncManager.registerDevice("GCM", FirebaseInstanceId.getInstance().getId());, j'appelle maintenant cognitoSyncManager.unregisterDevice(). Apparemment, si vous appelez registerDevice() lors d'une précédente exécution de l'application et que l'inscription n'a pas abouti, la classe CognitoSyncManager stocke toujours dans SharedPreferences qu'elle est enregistrée et bloquera ainsi tous les futurs appels à registerDevice() jusqu'à ce que unregisterDevice() soit appelée.