Не удается записать не текущие объекты пользователя 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 ответ:
По соображениям безопасности 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 }];