2016-12-03 33 views
2

我已經能夠在單個iOS設備上註冊,確認和同步用戶數據集,但嘗試在其他設備上同步時遇到了問題。我正在努力弄清楚爲什麼會發生這種情況。在註冊過程中,我同步數據集,並可以在聯合身份識別瀏覽器中看到它。但是,在其他設備上同步時,我無法從我的數據集中讀取數據。用戶信息是否存儲在本地設備上?我的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),而後再同步你看到發生的歷史與未經認證的身份有關。

我懷疑這是因爲您缺少對憑據的調用。僅僅獲取身份標識是不夠的,如果你從來沒有調用憑證,那麼憑證提供程序從來不會調用你登錄(),如果他從不調用登錄(),那麼他從來沒有看到登錄已完成,因此他從不遞增登錄計數(這就是爲什麼您可能會在identityBrowser中看到身份識別碼爲0的原因)。這意味着您正在使用未經身份驗證的身份。

如果您有0登錄計數,則您未通過身份驗證。

這個回答對您有很好的幫助。

multiple devices cognito ios login

它是從你的問題不清楚你是如何產生的谷歌令牌和Twitter等,但我要指出的是,用戶羣能夠返回的登錄。