2016-12-03 5 views
2

ユーザーデータセットを1つのiOSデバイスに登録、確認、同期することはできましたが、他のデバイスで同期しようとすると問題が発生しています。私はなぜこれが起こっているのか把握するのに苦労しています。サインアッププロセス中に私はデータセットを同期させ、私はフェデレーションIDアイデンティティブラウザでそれを見ることができます。しかし、他のデバイスで同期すると、私は自分のデータセットから読み込むことができません。ユーザー情報はデバイスにローカルに保存されていますか?私のCognito同期ロジックが間違っていますか?私はこれに近づくべき別の方法がありますか?以下は、ログイン時にユーザーデータを同期するためのコードです。事前に感謝します..私は本当にこの問題を解決する方法に混乱しています。複数のiOSデバイス間でAmazon Cognitoデータセットを同期できません

func login(usernameText : String, passwordText : String){ 
    user = self.pool!.getUser(usernameText) 
    var userString = "" 
    print("Login Current thread \(Thread.current)") 

    user?.getSession(usernameText, password: passwordText, validationData: nil).continue({ task in 
     DispatchQueue.main.async { 
     print(" Session Current thread \(Thread.current)") 
     if let err = task.error { // some sort of error 

      print("LOGIN FAILED") 
      print(err) 
      self.userConfirmed = false 
      //print(err.userInfo["message"] as! String) 
     } 
     else { //Successful login! 

      // this gets our token from the User Pool 
      let ret = task.result! as AWSCognitoIdentityUserSession 
      let myToken = ret.idToken?.tokenString; 

      let customcedentialProvider = AWSCustomIdentityProvider(tokens: [AWSCustomIdentityProvider.CognitoTokenKey : myToken!]) 
      let credentialsProvider = AWSCognitoCredentialsProvider(regionType: CognitoConstants.COGNITO_REGIONTYPE, identityPoolId: CognitoConstants.COGNITO_IDENTITY_POOL_ID, identityProviderManager: customcedentialProvider) 
      let configuration = AWSServiceConfiguration(region: CognitoConstants.COGNITO_REGIONTYPE, credentialsProvider:credentialsProvider) 
      AWSServiceManager.default().defaultServiceConfiguration = configuration 

      // wipe cached creds 
      credentialsProvider.clearKeychain() 
      credentialsProvider.clearCredentials() 

      // hit it 
      credentialsProvider.getIdentityId().continue({ (task: AWSTask!) -> AnyObject! in 
       DispatchQueue.main.async { 
       print("Current thread \(Thread.current)") 
       if (task.error != nil) { 
        print("Error: ") 

       } else { 
        print(credentialsProvider.identityId!) 
        // the task result will contain the identity id 
        let credentialsProviderUser = AWSCognitoCredentialsProvider(regionType:.usEast1,identityPoolId:credentialsProvider.identityId!) 

        let configurationUser = AWSServiceConfiguration(region:.usEast1, credentialsProvider:credentialsProviderUser) 
        AWSServiceManager.default().defaultServiceConfiguration = configurationUser 

        // Initialize the Cognito Sync client 
        let syncClient = AWSCognito.default() 
        // Get User Dataset 
        let dataset = syncClient?.openOrCreateDataset("myDataset") 
        print(dataset?.size() as Any) 
        let userData = dataset?.getAll() 

        for (key,value) in userData!{ if "\(value)".characters.count > 0 {userString.append("| Key: \(key) Value: \(value) ");print("| Key: \(key) Value: \(value) ")} 
        } 

       } 
       let defaults = UserDefaults.standard 

       defaults.setValue(userString, forKey: defaultsKeys.keyOne) 
       defaults.setValue(passwordText, forKey: defaultsKeys.keyTwo) 

       defaults.synchronize() 

       } 
       return nil 
       }) 
      }} 
     return nil 
     }) 
} 

// Class for custom tokens 
class AWSCustomIdentityProvider: NSObject, AWSIdentityProviderManager 
{ 
    static let FacebookTokenKey = "graph.facebook.com" 
    static let GoogleTokenKey = "accounts.google.com" 
    static let TwitterTokenKey = "api.twitter.com" 
    static let CognitoTokenKey = "cognito-idp.us-east-1.amazonaws.com/us-east-1_XXXXXXXXX" 

    var tokens: NSDictionary = [String : String]() as NSDictionary 

    init(tokens: [String : String]) { 
     self.tokens = tokens as NSDictionary 
    } 

    func logins() -> AWSTask<NSDictionary> { // AWSIdentityProviderManager delegate method 
     return AWSTask(result: tokens) 
    } 
} 

答えて

0

は、私は(ログインはあるカウント0)あなたが本当に認証され取得されていないと思われると、あなたはoccuringが認証されていないアイデンティティに関連付けられている参照sync'ing。

資格情報の呼び出しが不足していると思われます。アイデンティティIDを取得するだけでは不十分です。クレデンシャルプロバイダは決してログイン()を呼び出すことはありません。ログインをしていない場合()、ログインが完了していないと判断しないため、ログイン回数を増やします(アイデンティティのidentityBrowserにログインが表示されるのはなぜですか)。つまり、認証されていないIDを使用しています。

ログイン回数が0の場合、認証されません。

この回答はお役に立ちます。

multiple devices cognito ios login

あなたがなど、GoogleとTwitterのためのトークンを生成する方法をあなたの質問から明らかではないが、私は、ユーザーのプールはログインを返すことが可能であることを指摘しなければなりません。

関連する問題