Swift - Firebase 在 Firestore 中获取 Facebook 好友 UID

Posted

技术标签:

【中文标题】Swift - Firebase 在 Firestore 中获取 Facebook 好友 UID【英文标题】:Swift - Firebase Getting a Facebook Friends UID in Firestore 【发布时间】:2018-04-14 14:12:35 【问题描述】:

了解一点背景知识 - 我有一个“关注 Facebook 朋友”视图控制器,用户可以在其中查看他们的朋友,他们也下载了我的应用以在应用上关注。

我已正确调用 FBSDK 以获取也下载了该应用程序的朋友列表,但现在我需要在 Firebase 中获取这些朋友的 uid,以便我可以相应地关注/取消关注他们。

目前,当我获得 FB 用户 ID 时 - 我获得了 facebook 文档中提到的数字字符串。但是,Firebase 中的用户 uid 是不同的。有没有办法找到与 FB id 相关联的 firebase 用户?或者我应该尝试通过 facebook id 在 firebase 中存储 Facebook 用户?

    var facebookContacts = [User]()

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "facebookContactCell", for: indexPath) as! FacebookContactCell

    // Configure the cell...
    let user = facebookContacts[indexPath.row]

    cell.contactNameLabel.text = user.name
    cell.userId = user.documentId
    // Set follow button state
    if followingArray.contains(cell.userId) 
        cell.followButton.isSelected = true
     else 
        cell.followButton.isSelected = false
    

    let userImageRef = storage.child("userImages/"+(user.documentId)+"/profile_pic.jpg")
    // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
    userImageRef.getData(maxSize: 1 * 1024 * 1024)  (data, error) in
        if let error = error 
            // Uh-oh, an error occurred! Display Default image
            print("Error - unable to download image: \(error)")
            cell.contactImageView.image = UIImage(named: "userProfileGray")
         else 
            // Data for "locationImages/(locationId).jpg" is returned
            cell.contactImageView.image = UIImage(data: data!)
        
        SVProgressHUD.dismiss()
    

    return cell


    func getFbFriends() 
    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 error == nil 
            let resultdict = result as! NSDictionary
            print("Result Dict: \(resultdict)")

            let data : NSArray = resultdict.object(forKey: "data") as! NSArray
            for i in 0..<data.count 
                let valueDict : NSDictionary = data[i] as! NSDictionary
                let id = valueDict.object(forKey: "id") as! String
                print("the id value is \(id)")
                let name = valueDict.object(forKey: "name") as! String
                print("the name value is \(name)")

                let picDict = valueDict["picture"] as! NSDictionary
                let picData = picDict["data"] as! NSDictionary
                let picURL = picData.object(forKey: "url") as! String
                print("the url value is \(picURL)")

                self.facebookContacts.append(User(name: name, documentId: id))
            
            DispatchQueue.main.async 
                self.tableView.reloadData()
            

            let friends = resultdict.object(forKey: "data") as! NSArray
            print("Found \(friends.count) friends")
         else 
            print("Error Getting Friends \(String(describing: error))");
        
    )
    connection.start()

【问题讨论】:

【参考方案1】:

我认为您无法根据用户的 Facebook ID 获取用户的 UID。看来你有两种可能:

    通过电子邮件搜索。这应该可以让您确定您正在寻找的人。 实施自定义 Facebook 身份验证。它需要一些额外的工作,但并不难做到。

【讨论】:

我考虑过第一个选项,但我认为您无法获取 Facebook 朋友的电子邮件地址?即使他们已授予应用权限 @pmanning 可能不会。在这种情况下,自定义身份验证是您唯一的选择。它的好处是您可以将 FB 数据的存储移动到您的 JWT 端点中。我的意思是,一旦用户登录,您就可以提取所有必要的数据并将其放入数据库中,而无需在客户端执行任何操作。如果您要实现自定义身份验证,请不要忘记在 Firebase 中您可以声明可以通过 http 调用的函数;) @pmanning 你有想过这个吗?我正在尝试做同样的事情。

以上是关于Swift - Firebase 在 Firestore 中获取 Facebook 好友 UID的主要内容,如果未能解决你的问题,请参考以下文章

VueJS Firebase 应用程序导出默认错误的问题

无法将数据添加到 Firestore 集合?

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

Firebase Firestore 模拟器错误`主机已在 settings() 和 useEmulator() 中设置,将使用模拟器主机`

INVALID_ARGUMENT:每个请求最多允许 500 次写入 - Firebase Cloud Function - Firestore