Facebook的自定义UIButton登录
问题描述:
我一直在一个小项目,我需要人登录/登录使用Facebook /谷歌。迄今为止,Google的Firebase身份验证功能一直非常完美。Facebook的自定义UIButton登录
我基本上与Facebook合作,所以所有功能都可以。
现在我想“风格”一下,并给它一个定制的外观。我似乎无法做到这一点。
我做了一个UIButton,我可以四处移动,改变形状并基本控制一切。我想让我的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")
}
}
答
我找到了一种方法来做到这一点。如果推荐它,我现在不会,但它完美地工作。
- 添加一个UIView到故事板,并给它 你想要的形状和大小。
- 给UIView的一个FBSDKLoginButton子类 - 这样的:UIView with FBSDKLoginButton Class
现在,在您的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")
}
希望可以帮助,如果有人和我一样处境相同。