无法通过PFUser currentuser写入非当前用户对象

rih*_*ihe 2 objective-c ios parse-platform

我想写一个PFUser对象currentUser,我已经添加了ACL基于Parse开发人员指南,但我仍然收到一个错误:

 'User cannot be saved unless they have been authenticated via logIn or signUp'    
Run Code Online (Sandbox Code Playgroud)

_我的代码:

PFQuery *query = [PFUser query];
    [query whereKey:@"username" equalTo:self.bBo];
    PFObject *friendData = [query getFirstObject];

    PFUser *user = (PFUser *)friendData;

    PFACL *userACL = [PFACL ACL];

    user.ACL = userACL;

    [userACL setWriteAccess:YES forUser:[PFUser currentUser]];

    PFRelation *friendRelation = [user relationforKey:@"array"];
    [friendRelation addObject:[PFUser currentUser]];

    [user saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (error){
            NSLog(@"Error %@ %@", error, [error userInfo]);
        }
    }];
Run Code Online (Sandbox Code Playgroud)

我想我做的一切都是正确的,所以我无法弄清楚可能是什么问题.所以,如果您之前做过类似的事情或知道问题在哪里,我会非常感谢任何建议.

use*_*977 9

出于安全原因,Parse不允许您将任何更改保存到当前未登录的用户.

如果您希望能够进行更改并保存更改user,则需要使用Cloud CodeMaster Key绕过此障碍.

我以前遇到过这样的多个问题,而且每次我都被迫使用解决方法Cloud Code.

以下是我为在两个用户之间创建朋友关系所做的解决方法示例:

[PFCloud callFunction:@"editUser" withParameters:@{@"userId": user.objectId}];
Run Code Online (Sandbox Code Playgroud)

上面的代码语句是在xcode中,并执行我添加到我的Cloud Code文件中的函数.

然后,这是我的Cloud Code文件的样子:

Parse.Cloud.define('editUser', function(request, response) {
    var userId = request.params.userId;

    var User = Parse.Object.extend('_User'),
        user = new User({ objectId: userId });

    var currentUser = request.user;

    var relation = user.relation("friendsRelation");
    relation.add(currentUser);

    Parse.Cloud.useMasterKey();
    user.save().then(function(user) {
        response.success(user);
    }, function(error) {
        response.error(error)
    });
});
Run Code Online (Sandbox Code Playgroud)

上面的代码使用它Master Key来保存对当前登录用户以及objectId传递给此函数的用户的更改.

代码详情:

var relation
Run Code Online (Sandbox Code Playgroud)

这只是我正在创建的一个变量,用于保存以下函数返回的内容:

user.relation("friendsRelation");
Run Code Online (Sandbox Code Playgroud)

在上面的函数中,"friendsRelation"是Parse中我的PFRelation键的名称.

现在我们有一个有效的关系对象包含在我们调用的变量中relation,我们用currentUser对象的参数执行这个函数.

在那之后,剩下的就是保存一切.我不用javascript编程,但我仍然能够通过查看Parse Cloud Code文档,并在他们的支持论坛上搜索来提出上述解决方案.

如果您从上面获取我的模板,并进行一些小的更改,那么您应该能够轻松地完成您的需要.你只需要跳过这些额外的箍,因为Parse SDK不希望有人可以登录并以某种方式对其他用户的帐户进行更改,无论是由于他们自己的错误还是开发人员的错误.

编辑:

以下是为当前用户添加关系的代码:

PFRelation *friendsRelation = [[PFUser currentUser]relationforKey:@"friendsRelation"];

    PFUser *user = [self.parseUsers objectAtIndex:indexPath.row];

    [friendsRelation addObject:user];
    [currentUser saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (error) {
            NSLog(@"%@ %@", error, [error userInfo]);
        }
    }];
Run Code Online (Sandbox Code Playgroud)

然后您可以在以下情况后立即调用Cloud Code方法:

    [PFCloud callFunction:@"editUser" withParameters:@{
                                                       @"userId": user.objectId
                                                       }];
Run Code Online (Sandbox Code Playgroud)