草庐IT

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

coder 2024-01-29 原文

我已经能够在单个 iOS 设备上注册、确认和同步用户数据集,但在尝试在其他设备上同步时遇到了问题。我正在努力弄清楚为什么会这样。在注册过程中,我同步了数据集,我可以在联合身份身份浏览器中看到它。但是在其他设备上同步时,我无法从我的数据集中读取。用户信息是否存储在设备本地?我的 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),并且您看到的同步与未经身份验证的身份相关联。

我怀疑这是因为您缺少对凭据的调用。获得身份 ID 是不够的,如果你从不调用凭据,那么......凭据提供者从不调用你登录(),如果他从不调用登录()那么他永远不会看到登录已经完成,因此他永远不会增加登录计数(这就是为什么您可能会在身份的 identityBrowser 中看到 0 个登录)。这意味着您使用的是未经身份验证的身份。

如果您的登录次数为 0,则您未通过身份验证。

这个答案可能对您也有帮助。

multiple devices cognito ios login

从你的问题中不清楚你是如何为谷歌和推特等生成 token 的,但我应该指出用户池能够返回登录。

关于ios - 无法跨多个 iOS 设备同步 Amazon Cognito 数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40952065/

有关ios - 无法跨多个 iOS 设备同步 Amazon Cognito 数据集的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  6. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  9. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  10. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

随机推荐