0

我一直在一個小項目,我需要人登錄/登錄使用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") 
} 


} 

回答

0

我找到了一種方法來做到這一點。如果推薦它,我現在不會,但它完美地工作。

  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") 
} 

希望可以幫助,如果有人和我一樣處境相同。