Пользовательский 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 ответ
Я нашел способ сделать это. Я не знаю, если это рекомендуется, но работает отлично.
- Добавьте UIView к вашей раскадровке и задайте ему желаемую форму и размер.
- Дайте 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")
}
Надеюсь, это поможет, если кто-то был в такой же ситуации, как я.