我正在 2 个用户之间建立私有(private)聊天。目前,我已将“聊天”类开放给所有人(读/写),所有消息(对象)都将发送到这里。
我正在考虑添加只允许在两个用户之间读取的对象,这样只有他们才能看到他们聊天的内容。
我正在使用以下方式获取消息:
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)
{
....
}];
这是正确的方法吗?
最佳答案
我已经实现了一个类似的应用程序,采用了似乎有效的相同方法。但我认为你已经把它需要的复杂化了。
你需要一个你似乎拥有的聊天类。这可能类似于:
Chat
Object ID, Message, Author, Date, Date Seen, ACL, etc....
(there's many good schemas out there just google it)
然后,当您为 friend 创建新的聊天消息时,您只需创建一个新的 PFObject,将其他用户的 ACL 权限设置为喜欢您已正确完成。
用户可以通过调用来阅读他的消息
PFQuery *query = [PFQuery queryWithClassName:@"Chat"];
查询的响应只会是用户具有读取权限的聊天,而不是所有人。因此,除非您要查找未读消息等,否则无需指定任何进一步的查询参数。
关于ios - 只允许 2 个用户从公共(public)类读取一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24674960/