You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:36:13