Swift – 从Facebook登录获取错误

刚开始我看了很多例子,但似乎无法找到解决方案。 好吧我以为我做了但它似乎没有用。

我要做的是使用Facebook的Firebase身份validation登录方法,顺便说一下。 我的问题是,当facebook方法抛出电子邮件/凭证已存在的错误时,我想要链接密码validation凭据和facebook身份validation凭据。 我在这里读到我可以使用error.email但它没有给我访问email.error的选项。 我可能会遗漏一些东西而且我花了很多时间试图解决这个问题。

这是我的代码:

 func signInFacebookUser() { let fbLoginManager = FBSDKLoginManager() fbLoginManager.logIn(withReadPermissions: ["public_profile", "email"], from: self) { (result, error) in if let error = error { self.errorMessagePopUp(title: "Failed to login", message: error) return } guard let accessToken = FBSDKAccessToken.current() else { print("Failed to get access token") return } let credential = FacebookAuthProvider.credential(withAccessToken: accessToken.tokenString) Auth.auth().signIn(with: credential, completion: { (user, error) in if let error = error { let errCode = AuthErrorCode(rawValue: error._code)! switch errCode { case .accountExistsWithDifferentCredential: // somehow obtain email right here. self.showSigninForm(attributes: self.attributes(), style: .light) return default: return } } self.performSegue(withIdentifier: "signInBtnPressed", sender: nil) }) } } 

试试这个代码

 @IBAction func facebookLoginButtonTapped(_ sender: UIButton) { if Utility.checkInternet(){ let fbLoginManager: FBSDKLoginManager = FBSDKLoginManager() fbLoginManager.logIn(withReadPermissions: ["email", "public_profile"], from: self) { (result, error) in if (error == nil){ let fbLoginResult: FBSDKLoginManagerLoginResult = result! if fbLoginResult.grantedPermissions != nil { if(fbLoginResult.grantedPermissions.contains("email")){ self.facebookLogin() } } } } } else{ Utility.showAlert("Connection Error!", message: "Please check internet connection and retry.", viewController: (self.window?.rootViewController)!) } } 

 func facebookLogin() { Utility.showProgress("") if((FBSDKAccessToken.current()) != nil) { FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"id, name, first_name, last_name, picture.type(large), email "]).start(completionHandler: { (connection, result, error) in if result == nil { } else{ self.userResults = result as! [String : AnyObject] self.email = (self.userResults["email"] as? String) ?? "" if (self.email != "") { } else{ Utility.showAlert("Login Faild", message: error?.localizedDescription, viewController: self) } } }) } } 

这适用于我

 @objc func loginButtonClicked() { var alertController = UIAlertController() let loginManager = LoginManager() loginManager.logIn(readPermissions: [ReadPermission.email], >viewController: self, completion: {loginResult in switch loginResult { case .failed(let error): print(error) case .cancelled: print("User cancelled login.") case .success(let grantedPermissions, let declinedPermissions, let accessToken): alertController = UIAlertController(title: "Login Success", message: "Login succeeded with granted permissions:\(grantedPermissions)") self.present(alertController, animated: true, completion: nil) print("Logged in!") self.getDataUser() } }) } 
  func getDataUser() { let request = GraphRequest(graphPath: "me?fields=first_name,last_name,email", parameters:[:], httpMethod: .GET) request.start { httpResponse, result in switch result { case .success(let response): do { print("Graph Request Succeeded: \(response)") let dicval = response.dictionaryValue let email = dicval?.keys print("Graph Request Succeeded: \(String(describing: email))") } case .failed(let error): print("Graph Request Failed: \(error)") } } } }