просто для начала я просмотрел много примеров, но, похоже, не нашел решения. Ну, я думал, что сделал, но, похоже, это не работает.
Я пытаюсь использовать метод авторизации Firebase для facebook, который, кстати, работает. Моя проблема в том, что я хочу связать учетные данные аутентификации пароля и учетные данные аутентификации facebook, когда метод facebook выдает ошибку, что адрес электронной почты / учетные данные уже существуют. Я прочитал здесь, что я мог бы использовать 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)
})
}
}
на ссылку, которой вы поделились, уже дан ответ, и результат, полученный через ответ по этой ссылке, такой же, как и результат, который вы ожидаете
@KarthickRamesh да, это правильно.
@iOSGeek okaaaayy ... Не совсем понимаю, к чему вы клоните. Ссылка, которую я упомянул, говорит об использовании error.email, но не позволяет мне использовать error.email в моем коде.





Попробуйте этот код
@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)
}
}
})
}
}
Это работает для меня Swift4
@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 accessToken): print(accessToken) } }) }
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)")
}
}
}
}
Итак, вы хотите получить адрес электронной почты, с которого пользователь пытался войти в facebook, верно?