Facebook的自定义UIButton登录

问题描述:

我一直在一个小项目,我需要人登录/登录使用Facebook /谷歌。迄今为止,Google的Firebase身份验证功能一直非常完美。Facebook的自定义UIButton登录

我基本上与Facebook合作,所以所有功能都可以。

现在我想“风格”一下,并给它一个定制的外观。我似乎无法做到这一点。

我做了一个UIButton,我可以四处移动,改变形状并基本控制一切。我想让我的UIButton做确切相同的本地Facebook的LoginButton。

我去了Facebook自己的文档。我尝试了一切。我复制/粘贴他们写的代码,它会给出多个错误。我尝试了所有我能找到的教程,没有任何帮助。一个教程让我有点想法,但没有完成。 我复制的Facebook代码:https://developers.facebook.com/docs/swift/login

非常感谢,我希望有人能帮助我。

enter image description here

这里是我的代码,如果这能帮助:

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到故事板,并给它 你想要的形状和大小。
  2. 给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") 
} 

希望可以帮助,如果有人和我一样处境相同。