未调用IOS AWS Cognito处理程序并返回错误的数据集值

时间:2015-07-20 20:19:49

标签: ios aws-sdk amazon-cognito

我有两个相关的问题。

问题一:让Conflict Resolution HandlerDataset Merge Handler生效。我已经多次阅读了the documentation,但我没有看到任何成功,文档最多也是模糊的。似乎块处理程序似乎永远不会被调用。

如果我通过脸谱证明,它需要我之前的Unauthenticated身份并将其合并到facebook身份中。但是,现在我有两个冲突的数据集条目显示该facebook身份:

enter image description here

以下是我正在做的事情的一个例子:

- (void)synchronizeCognito
{
    // Initialize the Cognito Sync client
    AWSCognito *syncClient = [AWSCognito defaultCognito];

    AWSCognitoDataset *dataset = [syncClient openOrCreateDataset:@"testing"];

    // Create a record in a dataset and synchronize with the server
    [dataset setString:identifier forKey:@"test1"];
    [dataset setString:token forKey:@"test2"];

    syncClient.conflictHandler = ^AWSCognitoResolvedConflict* (NSString *datasetName, AWSCognitoConflict *conflict) {
        NSLog(@"%@", dataset);
        // always choose local changes
        return [conflict resolveWithRemoteRecord];
    };

    dataset.conflictHandler = ^AWSCognitoResolvedConflict* (NSString *datasetName, AWSCognitoConflict *conflict) {
        // override and always choose remote changes
        return [conflict resolveWithRemoteRecord];
    };


    syncClient.datasetMergedHandler = ^(NSString *datasetName, NSArray *datasets) {
        // Blindly delete the datasets
        for (NSString *name in datasets) {
            AWSCognitoDataset *merged = [[AWSCognito defaultCognito] openOrCreateDataset:name];
            [merged clear];
            [merged synchronize];
        }
    };

    // synchronize the data
    [dataset synchronize];
}

问题二:  再次,当我用facebook验证我的unauthenticated身份时,它将两者合并。我明白了:identity changed from us-east-1:b0a5b4c4-8d7b-4564-9f92-5ea49bbfdcdc to us-east-1:f0bea5d1-a888-4f8f-8957-6589d9700c1e

但如果我这样做:

- (NSString *)getTest
{
    AWSCognitoDataset *dataset = [syncClient openOrCreateDataset:@"testing"];

    return [dataset stringForKey:@"test1"];
}

它返回来自OLD身份数据存储区的test1值数据,而不是新的facebook身份数据存储区,即使它们现在已经切换了。我怀疑是因为上面没有调用冲突或合并处理。

1 个答案:

答案 0 :(得分:1)

很抱歉这个混乱。在此方案中永远不会调用您的冲突处理程序。仅当本地和远程数据在同步之间发生更改时,才会发生Amazon Cognito中的冲突。由于您正在更改数据同时合并标识,因此会发生合并流。

检测到身份合并时,Amazon Cognito库会执行以下操作:

  1. 将所有本地数据集重命名为" NAME.old_identity_id"
  2. 调用合并处理程序(如果已定义)。
  3. 这意味着如果您进行了更改但未进行同步,则登录并导致身份合并,除非您使用developer guide中的第二个流,否则本地更改将永远不会传播到远程同步存储并根据需要复制数据。我怀疑这是造成你第二个问题的原因。

    至于你的第一个,你确定没有调用合并处理程序吗?你能为你的处理程序添加一些调试,看看它是否真的被调用了吗?