Пользовательский UIButton для входа в Facebook

Я работал над небольшим проектом, и мне нужны люди, чтобы войти / войти, используя Facebook/Google. До сих пор он отлично работал с Google Firebase Auth.

Я в основном работаю с Facebook, так что все функции в порядке.

Теперь я хотел бы немного "стилизовать" его и придать ему индивидуальный вид. Я не могу этого добиться.

Я сделал UIB-кнопку, по которой я могу передвигаться, менять форму и в основном контролировать все. Я хотел бы, чтобы моя UIButton делала то же самое, что и нативная кнопка Facebook LoginButton.

Я пошел в собственную документацию Facebook. Я перепробовал все. Я скопировал / вставил код, который они написали, это выдает несколько ошибок. Я перепробовал все учебники, которые смог найти, но ничего не помогло. Один урок немного помог мне, но не совсем. Код Facebook, который я скопировал: https://developers.facebook.com/docs/swift/login

Большое спасибо заранее, я надеюсь, что кто-то может мне помочь.

Вот мой код, если это поможет:

import UIKit
import FacebookLogin
import FacebookCore
import FBSDKLoginKit
import FBSDKCoreKit
import FirebaseAuth

class ViewController: UIViewController, FBSDKLoginButtonDelegate {

let loginButton: FBSDKLoginButton = FBSDKLoginButton()

@IBOutlet weak var SpinnerLogin: UIActivityIndicatorView!

override func viewDidLoad() {
    super.viewDidLoad()

    loginButton.isHidden = true

    FIRAuth.auth()?.addStateDidChangeListener { auth, user in
        if let user = user {
            // User is signed in.

            let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let homeViewController: UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "HomeView")

            self.present(homeViewController, animated: true, completion: nil)


        } else {
            // No user is signed in.

            self.loginButton.readPermissions = ["public_profile", "email", "user_friends" ]
            self.loginButton.center = self.view.center
            self.loginButton.delegate = self
            self.view.addSubview(self.loginButton)


            self.loginButton.isHidden = false


        }
    }

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//Tells us if person is logged in
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {

    self.loginButton.isHidden = true

    if (error != nil) {
        //Handle error
        self.loginButton.isHidden = false
    }

    else if (result.isCancelled) {
        //Handle cancel event
        self.loginButton.isHidden = false

    }

    else {

    SpinnerLogin.startAnimating()

    let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)

    FIRAuth.auth()?.signIn(with: credential) { (user, error) in

        print("User Logged in to Facebook")
        print("You are now signed in to Firebase")
    }
    }
}

//Tells us if person logged out
func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) {

    print("User did log out")
}


}

1 ответ

Я нашел способ сделать это. Я не знаю, если это рекомендуется, но работает отлично.

  1. Добавьте UIView к вашей раскадровке и задайте ему желаемую форму и размер.
  2. Дайте UIView подкласс FBSDKLoginButton - как это: UIView с классом FBSDKLoginButton

Теперь в вашем файле swift сделайте так:

@IBOutlet weak var viewFBLogin: FBSDKLoginButton! = FBSDKLoginButton()

В вашем viewDidLoad сделайте это:

viewFBLogin.delegate = self

И тогда вы можете решить, какое разрешение вы хотите, и все это, я следовал документации Firebase, так что вот как это выглядит для меня:

    override func viewDidLoad() {
    super.viewDidLoad()

    //THIS LINE IS SUPER IMPORTANT, OTHERWISE THE REST OF THE CODE WONT KNOW IF USER IS LOGGED IN OR OUT
    viewFBLogin.delegate = self

    viewFBLogin.layer.cornerRadius = 20

    FIRAuth.auth()?.addStateDidChangeListener { auth, user in
        if let user = user {
            // User is signed in.

            let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let homeViewController: UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "HomeView")

            self.present(homeViewController, animated: true, completion: nil)


        } else {
            // No user is signed in.

            self.viewFBLogin.readPermissions = ["public_profile", "email", "user_friends" ]
            self.viewFBLogin.isHidden = false


        }
    }

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//Tells us if person is logged in - DOES NOT WORK WITHOUT DELEGATE UP TOP
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {

    self.viewFBLogin.isHidden = true

    if (error != nil) {
        //Handle error
        self.viewFBLogin.isHidden = false
    }

    else if (result.isCancelled) {
        //Handle cancel event
        self.viewFBLogin.isHidden = false

    }

    else {

    SpinnerLogin.startAnimating()

    let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)

    FIRAuth.auth()?.signIn(with: credential) { (user, error) in

        print("User Logged in to Facebook")
        print("You are now signed in to Firebase")
    }
    }
}

//Tells us if person logged out - DOES NOT WORK WITHOUT DELEGATE UP TOP
func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) {

    print("User did log out")
}

Надеюсь, это поможет, если кто-то был в такой же ситуации, как я.

Другие вопросы по тегам