我想在PFUser
写一个currentUser
对象,我已根据Parse开发人员指南添加了ACL
,但我仍然收到错误:
'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]);
}
}];
我认为我做的一切都是正确的,所以我无法弄清楚可能是什么问题。所以,如果您之前做过类似的事情或知道问题在哪里,我会非常感谢任何建议。
答案 0 :(得分:9)
出于安全原因,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"
是Parse中PFRelation键的名称。
现在我们在名为relation
的变量中包含了一个有效的关系对象,我们使用currentUser
对象的参数执行此函数。
在此之后,剩下的就是保存所有内容。我没有使用javascript编程,但我仍然可以通过查看Parse Cloud Code
文档并在其支持论坛上搜索来提出上述解决方案。
如果你从上面拿走我的模板,并进行一些小改动,那么你应该能够轻松地完成你需要的东西。你只需要跳过这些额外的箍,因为Parse SDK
并不想要有人可以登录并以某种方式对其他用户的帐户进行更改的情况,无论是他们自己的错还是开发人员&# 39;错了。
编辑:
以下是为当前用户添加关系的代码:
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]);
}
}];
然后您可以在以下之后立即调用Cloud Code方法:
[PFCloud callFunction:@"editUser" withParameters:@{
@"userId": user.objectId
}];