im doing a tutorial of a messenger app in a real.time database in firebase and facebook login.
i can login with facebook normally but when i try to insert the email and the name of facebook to the data base, i can login with facebook but the login with firebase is not working
the login with facebook stuff is the bottom of the code, is the last extension.
thx
import UIKit
import FirebaseAuth
import FBSDKLoginKit
class LoginViewController: UIViewController {
private let scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.clipsToBounds = true
return scrollView
}()
private let imageView: UIImageView = {
let imageView = UIImageView()
imageView.image = UIImage(named: "logo")
imageView.contentMode = .scaleAspectFit
return imageView
}()
private let emailField: UITextField = {
let field = UITextField()
field.autocapitalizationType = .none
field.autocorrectionType = .no
field.returnKeyType = .continue
field.layer.cornerRadius = 12
field.layer.borderWidth = 1
field.layer.borderColor = UIColor.lightGray.cgColor
field.placeholder = "Email Adress"
field.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 0))
field.leftViewMode = .always
field.backgroundColor = .white
return field
}()
private let passwordField: UITextField = {
let field = UITextField()
field.autocapitalizationType = .none
field.autocorrectionType = .no
field.returnKeyType = .done
field.layer.cornerRadius = 12
field.layer.borderWidth = 1
field.layer.borderColor = UIColor.lightGray.cgColor
field.placeholder = "Password"
field.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 0))
field.leftViewMode = .always
field.backgroundColor = .white
field.isSecureTextEntry = true
return field
}()
private let loginButton: UIButton = {
let loginButton = UIButton()
loginButton.setTitle("Log In", for: .normal)
loginButton.setTitleColor(.link, for: .normal)
loginButton.layer.cornerRadius = 12
loginButton.layer.masksToBounds = true
loginButton.titleLabel?.font = .systemFont(ofSize: 20, weight: .bold)
return loginButton
}()
private let facebookLoginButton: FBLoginButton = {
let button = FBLoginButton()
button.permissions = ["email,public_profile"]
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
title = "Log In"
view.backgroundColor = .white
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Register",
style: .done,
target: self,
action: #selector(didTapRegister))
loginButton.addTarget(self,
action: #selector(loginButtontapped),
for: .touchUpInside)
passwordField.delegate = self
emailField.delegate = self
facebookLoginButton.delegate = self
// Add subviews
view.addSubview(scrollView)
scrollView.addSubview(imageView)
scrollView.addSubview(emailField)
scrollView.addSubview(passwordField)
scrollView.addSubview(loginButton)
scrollView.addSubview(facebookLoginButton)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.frame = view.bounds
let size = scrollView.width / 3
imageView.frame = CGRect(x: (scrollView.width - size) / 2,
y: 20, width: size,
height: size)
emailField.frame = CGRect(x: 30,
y: imageView.bottom+40,
width: scrollView.width-60,
height: 52)
passwordField.frame = CGRect(x: 30,
y: emailField.bottom+10,
width: scrollView.width-60,
height: 52)
loginButton.frame = CGRect(x: 30,
y: passwordField.bottom+40,
width: scrollView.width-60,
height: 52)
facebookLoginButton.frame = CGRect(x: 30,
y: loginButton.bottom+10,
width: scrollView.width-60,
height: 52)
facebookLoginButton.frame.origin.y = loginButton.bottom + 20
}
@objc private func loginButtontapped() {
emailField.resignFirstResponder()
passwordField.resignFirstResponder()
guard let email = emailField.text, let password = passwordField.text, !email.isEmpty, !password.isEmpty, password.count >= 6 else {
alertUserLoginError()
return
}
// Firebase Log in
FirebaseAuth.Auth.auth().signIn(withEmail: email,
password: password) { [weak self] authResult, error in
guard let strongSelf = self else {
return
}
guard let result = authResult, error == nil else {
print("Failed to log in user: \(email)")
return
}
let user = result.user
print("Logged in user: \(user)")
strongSelf.navigationController?.dismiss(animated: true, completion: nil)
}
}
func alertUserLoginError() {
let alert = UIAlertController(title: "Ups",
message: "Please enter all the information to log in.",
preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Dismiss",
style: .cancel,
handler: nil))
present(alert, animated: true)
}
@objc private func didTapRegister() {
let vc = RegisterViewController()
vc.title = "Create Account"
navigationController?.pushViewController(vc, animated: true)
}
}
extension LoginViewController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == emailField {
passwordField.becomeFirstResponder()
}
else if textField == passwordField {
loginButtontapped()
}
return true
}
}
extension LoginViewController: LoginButtonDelegate {
func loginButtonDidLogOut(_ loginButton: FBLoginButton) {
// no operation
}
func loginButton(_ loginButton: FBLoginButton,
didCompleteWith result: LoginManagerLoginResult?,
error: Error?) {
guard let token = result?.token?.tokenString else {
print("User failed to log in with facebook")
return
}
let facebookRequest = FBSDKLoginKit.GraphRequest(graphPath: "me",
parameters: ["fields": "email, name"],
tokenString: token,
version: nil,
httpMethod: .get)
facebookRequest.start(completionHandler: { _, result, error in
guard let result = result as? [String: Any],
error == nil else {
print("Failed to make facebook graph request")
return
}
guard let userName = result["name"] as? String,
let email = result["email"] as? String else {
print("Failed to get email and name from fb result")
return
}
let nameComponents = userName.components(separatedBy: " ")
guard nameComponents.count == 2 else {
return
}
let firstName = nameComponents[0]
let lastName = nameComponents[1]
DatabaseManager.shared.userExists(with: email) { (exists) in
if !exists {
DatabaseManager.shared.insertUser(with: ChatAppUser(firstName: firstName,
lastName: lastName,
emailAddress: email))
}
}
let credential = FacebookAuthProvider.credential(withAccessToken: token)
FirebaseAuth.Auth.auth().signIn(with: credential, completion: { [weak self] authResut, error in
guard let strongSelf = self else {
return
}
guard authResut != nil, error == nil else {
if let error = error {
print("facebook credential log in failed, MFA maybe needed - \(error)")
}
return
}
print("Successfully logged user in")
strongSelf.navigationController?.dismiss(animated: true, completion: nil)
})
})
}
}