仅允许2个用户从公共类中读取对象

时间:2014-07-10 11:07:48

标签: ios xcode parse-platform

我正在建立2个用户之间的私聊。目前我已经向所有人开放了“聊天”课程(读/写),并且所有消息(对象)都在这里。

我正在考虑添加具有只允许在两个用户之间阅读的权限的对象,这样他们才能看到他们聊天的内容。

我正在使用以下方式抓取消息:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

PFQuery *fquery = [PFUser query]; // query to get the chat partener
[fquery whereKey:@"objectId" equalTo:[[NSUserDefaults standardUserDefaults] stringForKey:@"friendid"]];
PFUser *friend = (PFUser *)[fquery getFirstObject];    // got it!

PFQuery *query = [PFQuery queryWithClassName:@"Chat"]; // new query for grabbing messages
[query whereKey:PF_CHAT_ROOM equalTo:chatroom]; // @"Chat" = @"Chat"
if (message_last != nil) [query whereKey:PF_CHAT_CREATEDAT greaterThan:message_last.date]; 
[query includeKey:PF_CHAT_USER]; // current user
[query includeKey:[NSString stringWithFormat:@"%@", friend]]; // its friend/partener
[query orderByAscending:PF_CHAT_CREATEDAT]; // sort by date
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{
// adding the messages to an array;
 }];

用于编写要解析的消息:

PFObject *object = [PFObject objectWithClassName:@"Chat"]; // class name
object[PF_CHAT_ROOM] = chatroom; 
object[PF_CHAT_USER] = [PFUser currentUser];
object[PF_CHAT_TEXT] = text;

PFQuery *query = [PFUser query];
[query whereKey:@"objectId" equalTo:[[NSUserDefaults standardUserDefaults] stringForKey:@"friendid"]];
PFUser *friend = (PFUser *)[query getFirstObject];  // query to get the chat partener

PFACL *roleACL = [PFACL ACL];
[roleACL setReadAccess:YES forUser:[PFUser currentUser]];
[roleACL setReadAccess:YES forUser:friend];  // setting read permission for those guys

object.ACL = roleACL;
[object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error)
{ 
    ....
}]; 

这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

我已经实现了一个类似的应用程序采用相同的方法,似乎工作。但我认为你已经过度复杂了。

您需要一个您似乎拥有的聊天课程。这可能类似于:

Chat
Object ID, Message, Author, Date, Date Seen, ACL, etc.... 
(there's many good schemas out there just google it) 

然后,当您向朋友创建新的聊天消息时,您只需创建一个新的PFObject,将其他用户的ACL权限设置为您已正确完成。

用户可以通过调用

来阅读他的消息
PFQuery *query = [PFQuery queryWithClassName:@"Chat"]; 

查询的响应只是用户具有读取权限的聊天,而不是每个人的聊天。因此,除非您正在查找未读消息等,否则无需指定任何其他查询参数。