无法跨多个iOS设备同步Amazon Cognito数据集

无法跨多个iOS设备同步Amazon Cognito数据集,ios,amazon-web-services,swift3,amazon-cognito,Ios,Amazon Web Services,Swift3,Amazon Cognito,我已经能够在单个iOS设备上注册、确认和同步用户数据集,但在尝试在其他设备上同步时遇到问题。我正在努力弄清楚为什么会发生这种情况。在注册过程中,我同步了数据集,并可以在federated Identifications浏览器中看到它。但在其他设备上同步时,我无法读取数据集。用户信息是否本地存储在设备上?我的Cognito同步逻辑不正确吗?我还有别的办法吗?下面是我在登录时同步用户数据的代码。提前谢谢。。我真的很困惑如何解决这个问题 func login(usernameText : String

我已经能够在单个iOS设备上注册、确认和同步用户数据集,但在尝试在其他设备上同步时遇到问题。我正在努力弄清楚为什么会发生这种情况。在注册过程中,我同步了数据集,并可以在federated Identifications浏览器中看到它。但在其他设备上同步时,我无法读取数据集。用户信息是否本地存储在设备上?我的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)
    }
}
func登录(usernameText:String,passwordText:String){
user=self.pool!.getUser(usernameText)
var userString=“”
打印(“登录当前线程\(thread.Current)”)
user?.getSession(usernameText,密码:passwordText,validationData:nil)。继续({task in
DispatchQueue.main.async{
打印(“会话当前线程\(thread.Current)”)
如果让err=task.error{//某种错误
打印(“登录失败”)
打印(错误)
self.userconfirm=false
//打印(err.userInfo[“message”]为!字符串)
}
否则{//登录成功!
//这将从用户池中获取我们的令牌
让ret=task.result!作为AWSCognitoIdentityUserSession
让myToken=ret.idToken?.tokenString;
让CustomedEntityProvider=AWSCustomIdentityProvider(令牌:[AWSCustomIdentityProvider.CognitokenKey:myToken!))
let credentialsProvider=AWSCognitoCredentialsProvider(regionType:CognitoConstants.COGNITO_regionType,identityPoolId:CognitoConstants.COGNITO_IDENTITY_POOL_ID,identityProviderManager:customcedentialProvider)
let configuration=AWSServiceConfiguration(区域:CognitoConstants.COGNITO_REGIONTYPE,credentialsProvider:credentialsProvider)
AWSServiceManager.default().defaultServiceConfiguration=配置
//擦去缓存的信用
credentialsProvider.clearKeychain()
credentialsProvider.clearCredentials()
//击中它
credentialsProvider.getIdentityId()。在中继续({(任务:AWSTask!)->AnyObject
DispatchQueue.main.async{
打印(“当前线程\(thread.Current)”)
如果(task.error!=nil){
打印(“错误:”)
}否则{
打印(credentialsProvider.identityId!)
//任务结果将包含标识id
让credentialsProviderUser=AWSCognitoCredentialsProvider(regionType:.usEast1,identityPoolId:credentialsProvider.identityId!)
让configurationUser=AWSServiceConfiguration(区域:.usEast1,credentialsProvider:credentialsProviderUser)
AWSServiceManager.default().defaultServiceConfiguration=configurationUser
//初始化Cognito同步客户端
让syncClient=AWSCognito.default()
//获取用户数据集
让dataset=syncClient?.openOrCreateDataset(“myDataset”)
打印(数据集?.size()如有)
让userData=dataset?.getAll()
对于userData中的(键,值){if“\(值)”.characters.count>0{userString.append(“|键:\(键)值:\(值)”);打印(|键:\(键)值:\(值)”)}
}
}
让defaults=UserDefaults.standard
setValue(userString,forKey:defaultsKeys.keyOne)
setValue(密码文本,forKey:defaultsKeys.keytower)
defaults.synchronize()
}
归零
})
}}
归零
})
}
//用于自定义令牌的类
类AWSCustomIdentityProvider:NSObject,AWSideEntityProviderManager
{
静态让FacebookTokenKey=“graph.facebook.com”
静态设置GoogleTokenKey=“accounts.google.com”
静态设置TwitterTokenKey=“api.twitter.com”
静态let cognitokenkey=“cognito idp.us-east-1.amazonaws.com/us-east-1_uxxxxxxxxx”
var标记:NSDictionary=[String:String]()作为NSDictionary
初始化(令牌:[String:String]){
self.tokens=作为NSDictionary的令牌
}
func logins()->AWSTask{//AWSIdentityProviderManager委托方法
返回AWSTask(结果:令牌)
}
}

我怀疑您没有真正获得身份验证(登录计数为0),并且您看到的同步与未经身份验证的身份相关

我怀疑这是因为您错过了对凭据的呼叫。仅获取身份id是不够的,如果您从未调用凭据,则。。。凭据提供程序从不调用您的logins(),如果他从不调用logins(),则他永远不会看到登录已完成,因此他永远不会增加登录计数(这就是为什么您可能会在identity上的identityBrowser中看到0个登录)。这意味着您正在使用未经验证的身份

如果您的登录次数为0,则未对您进行身份验证

这个答案也可能对你有所帮助

您的问题不清楚您是如何为google和twitter等生成令牌的,但我应该指出,用户池能够返回登录