如何使用 Parse 在 User 中查询 Facebook 好友?

Posted

技术标签:

【中文标题】如何使用 Parse 在 User 中查询 Facebook 好友?【英文标题】:How can I query Facebook friends in User using Parse? 【发布时间】:2015-02-13 16:35:41 【问题描述】:

我使用 Parse 作为我的数据库。我想访问 _Users 类以查看我的 Facebook 朋友是否正在使用该应用程序(在 _User 类中)。我刚刚阅读了this,发现您无法再保存好友列表了。

到目前为止我的做法是:

我先得到朋友的FB id,然后在_User中查询。但是,我注意到 FacebookID 保存为 authData。除了创建一个将 facebookID 复制为字符串的新列之外,如何使用 FacebookID 查询我的 _User 类?

// Send request to Facebook
    [[FBRequest requestForMe] startWithCompletionHandler: ^(FBRequestConnection *connection, id result, NSError *error) 

        [FBRequestConnection startForMyFriendsWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
            if (!error) 
                // result will contain an array with your user's friends in the "data" key
                NSArray *friendObjects = [result objectForKey:@"data"];
                NSMutableArray *friendIds = [NSMutableArray arrayWithCapacity:friendObjects.count];
                // Create a list of friends' Facebook IDs
                for (NSDictionary *friendObject in friendObjects) 
                    [friendIds addObject:[friendObject objectForKey:@"id"]];
                
                self.fbfriendList = [NSMutableArray arrayWithArray:friendObjects];

                    PFQuery *friendQuery = [ParseUser query];

//PROBLEM is here where the fbId in my _User class is saved as authData
                    [friendQuery whereKey:@"fbID" containedIn:friendIds];

                    NSArray *friendUsers = [friendQuery findObjects];
                self.fbfriendList = friendObjects;  
            
        ]; 
    ];

【问题讨论】:

【参考方案1】:

默认情况下解析用户的 Facebook ID 是私有的,但您可以让其他用户访问它们。

为此,您可以使用 Facebook API 获取用户的 Facebook ID,将其分配给 Parse User 上的一个字段。然后,您可以在 User 集合上构造一个查询,以获取其 Facebook ID 在您用户的朋友列表中的 Parse 用户列表。

当您使用 Facebook 登录时,您应该这样做:

// When your user logs in, immediately get and store its Facebook ID
[PFFacebookUtils logInWithPermissions:permissionsArray
                                block:^(PFUser *user, NSError *error) 
  if (user) 
    [FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
      if (!error) 
        // Store the current user's Facebook ID on the user
        [[PFUser currentUser] setObject:[result objectForKey:@"id"]
                                 forKey:@"fbId"];
        [[PFUser currentUser] saveInBackground];
      
    ];
  
];

然后,当您准备好搜索用户的朋友时,您会发出另一个请求:

// Issue a Facebook Graph API request to get your user's friend list
[FBRequestConnection startForMyFriendsWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
  if (!error) 
    // result will contain an array with your user's friends in the "data" key
    NSArray *friendObjects = [result objectForKey:@"data"];
    NSMutableArray *friendIds = [NSMutableArray arrayWithCapacity:friendObjects.count];
    // Create a list of friends' Facebook IDs
    for (NSDictionary *friendObject in friendObjects) 
        [friendIds addObject:[friendObject objectForKey:@"id"]];
    

    // Construct a PFUser query that will find friends whose facebook ids
    // are contained in the current user's friend list.
    PFQuery *friendQuery = [PFUser query];
    [friendQuery whereKey:@"fbId" containedIn:friendIds];

    NSArray *friendUsers = [friendQuery findObjects];
  
];

最好的问候,

【讨论】:

这是唯一的方法吗? @EricChuang 我知道的唯一方法。 我在这方面取得了一些成功,但想知道有什么不同。有没有办法在 Cloud Code 上做到这一点? _User 上的 afterSave 之类的东西可以向应用程序上的所有用户发送推送,这些用户的朋友已经加入了匹配的 fbId? @user717452 是的,您可以通过 Cloud Code 进行操作。不过,我不知道这个的食谱。您应该在 Parse 文档中搜索它的等价物。

以上是关于如何使用 Parse 在 User 中查询 Facebook 好友?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Parse 从预定义的 User 类中查询 PFFile

Parse.com如何对包含的ParseObject进行排序和查询?

使用两个PFUser对象查询对象时,如何更新Parse中的值?

私人聊天应用程序 - Parse 和 Swift

Swift Parse 如何让应用离线工作?

任何人都知道如何在 QueryForTable 中缩小这个查询(使用 Parse.com)