如何从Facebook Graph API结果提取好友ID,用于Firebase排行榜分数查询
提取Facebook好友ID并查询Firestore分数指南
没问题,我来帮你搞定提取好友ID的问题,顺便给你后续查询Firestore分数的小建议~
第一步:解析Facebook Graph API返回的好友数据
Facebook的/me/friends接口返回的结果结构是这样的:外层是一个字典,其中data字段对应的是所有使用过你这款应用的好友数组(注意:user_friends权限现在只能获取同样授权过该应用的好友,不是用户的全部Facebook好友哦)。
你只需要在你的completionHandler里,先取出这个data数组,再遍历每个好友对象提取id即可。修改后的代码如下:
func getFriendsFromFB() { let params = ["fields": "id, first_name, last_name, name, email, picture"] let graphRequest = FBSDKGraphRequest(graphPath: "/me/friends", parameters: params) let connection = FBSDKGraphRequestConnection() connection.add(graphRequest, completionHandler: { (connection, result, error) in if let error = error { print("Error Getting Friends \(error)") return } // 解析返回数据 guard let userData = result as? [String:Any], let friendsData = userData["data"] as? [[String:Any]] else { print("Failed to parse friends data") return } // 提取所有好友ID并存储 var friendFacebookIds: [String] = [] for friend in friendsData { if let friendId = friend["id"] as? String { friendFacebookIds.append(friendId) // 也可以顺便提取其他信息,比如名字 let friendName = friend["name"] as? String ?? "Unknown" print("好友: \(friendName) - ID: \(friendId)") } } // 拿到ID数组后,就可以去Firestore查询好友分数啦 self.queryFriendScoresFromFirestore(friendIds: friendFacebookIds) }) connection.start() }
第二步:用好友ID批量查询Firestore分数
拿到好友的Facebook ID数组后,你可以用Firestore的whereField(_:in:)方法批量查询,这样比逐个查询效率高很多。示例代码如下:
func queryFriendScoresFromFirestore(friendIds: [String]) { let db = Firestore.firestore() db.collection("userScores") // 假设你的分数存在这个集合里 .whereField("facebookId", in: friendIds) // 你的用户文档里应该存了facebookId字段 .getDocuments { (querySnapshot, error) in if let error = error { print("查询分数失败: \(error)") return } guard let documents = querySnapshot?.documents else { print("没有找到好友分数") return } // 遍历查询结果,整理分数数据 var friendScores: [(name: String, score: Int, facebookId: String)] = [] for doc in documents { let data = doc.data() let facebookId = data["facebookId"] as? String ?? "" let score = data["score"] as? Int ?? 0 let name = data["name"] as? String ?? "Unknown" friendScores.append((name: name, score: score, facebookId: facebookId)) } // 这里就可以把friendScores用在你的排行榜UI里啦 print("好友分数列表: \(friendScores)") } }
注意事项
- 确认你的Firestore用户文档里确实存储了用户的Facebook ID(也就是你登录时写入的唯一ID),这样查询才能匹配上。
- 如果发现返回的好友数量比预期少,记得检查:好友是否真的授权过你的应用,以及你是否在Facebook开发者后台正确配置了
user_friends权限(并通过了审核,如果是上线应用的话)。
内容的提问来源于stack exchange,提问作者Astrum
相关产品推荐
相关产品推荐

