使用 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)
}
})
}
}
我在聊天应用程序上关注 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)
}
})
}
}