使用 FBSDKLoginKit 从仅使用 phone 号码注册的帐户中检索用户电子邮件:"email" 结果是什么 returns?

Retrieving user email, using FBSDKLoginKit, from an account registered with phone number only: what does "email" result returns?

我在聊天应用程序上关注 iOS 学院教程。在上述应用程序中,当用户首次使用 Facebook 登录时,我需要检索关联的电子邮件并将其存储在我的数据库中。潜伏在 YT 评论 ( here ) 中,我发现如果 FB 帐户使用 phone 号码注册,则它可能没有关联的电子邮件。引用文字评论:

我在没有电子邮件的情况下创建了我的 Facebook 帐户(仅通过 phone 号码)它仍然注册了身份验证但是标识符丢失了。它也不向数据库发送信息。如果只有 phone 的人已经尝试过。

因为我需要将检索到的电子邮件传递到我的 Firebase 实时数据库,所以我想处理这个问题,但我需要知道当我尝试使用 FBSKDLoginKit API 检索电子邮件时会发生什么,如果有的话没有关联的电子邮件。

因为我的 FB 有一个关联的电子邮件,显然没有办法删除它并将该字段留空,我试图用我的 phone 号码注册一个新的 FB 帐户。问题是,为了能够 运行 测试模式下的应用程序并登录 FB,我需要在 Facebook 上为开发人员验证它,但要登录开发人员,我需要一个关联的电子邮件。所以我走投无路,无法测试自己。

我的问题是:如果没有关联的电子邮件,有人知道 FB 请求中的电子邮件结果 returns 吗?

这是我的代码,我的猜测是该函数在下方注释行的 guard 块中命中 return,因为电子邮件等于 nil,但从我的角度来看我在 Youtube 上看过,似乎只有数据库块在 Firebase 身份验证成功时被跳过。所以也许它 returns 是一个空字符串,或者其他东西。

func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?) {

    guard let token = result?.token?.tokenString else {
        return
    }
    
    let facebookRequest = FBSDKLoginKit.GraphRequest(graphPath: "me",
                                                     parameters: ["fields" : "email, first_name"], tokenString: token,
                                                     version: nil,
                                                     httpMethod: .get)

    facebookRequest.start { [weak self] _, result, error in
        
        guard let result = (result as? [String: Any]), error == nil else {
            self?.alertUserLoginError(message: "An error occurred while processing your request. Please try to sign in using Google.")
            return
        }
        
        guard let firstName = (result["first_name"] as? String),
            let email = (result["email"] as? String) else {
                return
        }


 // Imo here the func returns cause email is equal to nil, but apparently that's not true. 
 // The database block is skipped, but the auth block down below is not. 


     DatabaseManager.shared.insertUser(with: chatUser, completion: { success in 
  
 // Doing other unrelated stuff

     }
       

  // The following block is run apparently, not sure why

    
        let credential = FacebookAuthProvider.credential(withAccessToken: token)

        FirebaseAuth.Auth.auth().signIn(with: credential) { authResult, error in
            
            
            guard authResult != nil, error == nil else {
                FBSDKLoginKit.LoginManager().logOut()
                return
            }         
        }
    }
}

这是 DatabaseManager class 中的数据库函数,上面调用了:

     public func insertUser(with user: ChatAppUser, completion: @escaping (Bool) -> Void) {
    database.child(user.safeEmail).setValue([
        "first_name" : user.firstName
    ],
    withCompletionBlock: { error, _ in
        guard error == nil else {
            completion(false)
            return
        }
        completion(true)
    })
}
func FacebookGETDataClicked(_ sender: Any)
{
    let fbLoginManager : LoginManager = LoginManager()
    fbLoginManager.logIn(permissions: ["email"], from: self) { (result, error) in
        if (error == nil){
            let fbloginresult : LoginManagerLoginResult = result!
            let fbloginresultsss: Set<String> = fbloginresult.grantedPermissions
            let arr = [String](fbloginresultsss)
            
            if arr.count > 0 {
                if(arr.contains("email"))
                {
                    self.getFBUserData()
                    fbLoginManager.logOut()
                }
            }
        }
    }
}

func getFBUserData(){
var userProfileImage = String()
var useremail = String()
var userFullName = String()
var userID = String()

if((AccessToken.current) != nil){
    GraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name,last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in
        if (error == nil){
            let dict = result as! [String : AnyObject]
            print(dict)
      
            if let mail = (dict["email"] as? String)
            {
                useremail = mail
            }
            
            if let name = (dict["name"] as? String)
            {
                userFullName = name
            }
            
            if let id = (dict["id"] as? String)
            {
                userID = id
            }
            
            if let pic = dict["picture"] as? NSDictionary
            {
                let profilePictureObj = pic
                
                let datas = profilePictureObj["data"] as! NSDictionary
                userProfileImage  = datas["url"] as! String
            }
            
            print(userID,useremail,userFullName,userProfileImage)
        }
        
    })
}

}