Не удается записать не текущие объекты пользователя PFUser currentuser


Я хотел бы написать объект PFUser по currentUser, я добавил ACL на основе руководства разработчика Parse, но я все равно получаю ошибку:

 'User cannot be saved unless they have been authenticated via logIn or signUp'    

_ мой код:

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]);
        }
    }];
Я думаю, что все сделал правильно, поэтому я не могу понять, в чем может быть проблема. Поэтому, если вы сделали ранее что-то подобное или знаете, в чем проблема, я был бы очень признателен за любые предложения.
1 2

1 ответ:

По соображениям безопасности Parse не позволит вам сохранить какие-либо изменения для пользователя, который в данный момент не вошел в систему.

Если вы хотите иметь возможность вносить и сохранять изменения в user, вам нужно использовать Cloud Code и Master Key, чтобы обойти этот блокпост.

У меня уже было несколько подобных проблем, и каждый раз я был вынужден использовать обходной путь через Cloud Code.

Вот пример обходного пути, который я сделал для создания дружеских отношений между двумя пользователи:

[PFCloud callFunction:@"editUser" withParameters:@{@"userId": user.objectId}];

Приведенный выше оператор кода находится в 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)
    });
});

Приведенный выше код использует Master Key для сохранения изменений как для текущего пользователя, так и для пользователя, которому objectId был передан в эту функцию.

Детали кода:

var relation

Это просто переменная, которую я создаю для хранения того, что возвращает следующая функция:

user.relation("friendsRelation");

В приведенная выше функция "friendsRelation" является именем моего ключа 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]);
        }
    }];

И тогда вы можете вызвать метод облачного кода правильно после:

    [PFCloud callFunction:@"editUser" withParameters:@{
                                                       @"userId": user.objectId
                                                       }];