处理Firebase + Facebooklogin过程

我在我的应用程序中有Facebooklogin,而且我在圈子里运行,试图让需要通过注册屏幕的新用户和注册用户直接进入应用程序。 这是处理Facebooklogin的function(当点击button和Facebook授权时):

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { if error != nil { return } FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "name"]).start { (connection, result, err) in let accessToken = FBSDKAccessToken.current() guard let accessTokenString = accessToken?.tokenString else {return} let credentials = FIRFacebookAuthProvider.credential(withAccessToken: accessTokenString) FIRAuth.auth()?.signIn(with: credentials, completion: { (user, error) in if error != nil { return } if(FBSDKAccessToken.current() != nil){ // logged in self.performSegue(withIdentifier: "loginToRooms", sender: nil) }else{ // not logged in self.performSegue(withIdentifier: "showSetupScreen", sender: nil) } }) if err != nil { return } } } 

在上面的FIRAuth.auth块中,我基本上说,一旦Facebookloginbutton被点击并通过Facebook授权,如果用户有一个访问令牌,直接进入应用程序。 否则,请进入用户input必要信息的注册屏幕。

我也有这个viewDidLoad ,所以当应用程序启动时,如果用户以前login,他们甚至不会看到login屏幕,他们会直接进入应用程序:

  // When app is launched, bring user straight in if they're already authorized. Otherwise show the login screen. FIRAuth.auth()?.addStateDidChangeListener { auth, user in if let user = user { // User is signed in. Show home screen self.performSegue(withIdentifier: "loginToRooms", sender: nil) } else { // No User is signed in. Show user the login screen return } } 

不过,我在testing中发现,如果我点击Facebooklogin并以新用户的身份inputFacebook凭据,我将获得授权,然后直接发送到应用程序,而无需通过注册屏幕。 这会导致各种问题。

对于那些使用FacebookloginFirebase的人来说,处理这种情况的好方法是什么? 我需要涵盖几个scheme:

  1. 如果新用户点击Facebookloginbutton,他们将被带到注册屏幕。
  2. 如果注册(但注销)的用户点击Facebookloginbutton,他们将直接进入应用程序。
  3. 如果注册的,仍然login的用户启动应用程序,他们将绕过login屏幕,并直接进入应用程序。

谢谢你的帮助!

当用户点击FBloginbutton时:

– >做本地FBlogin。 (就像你现在在做什么)

– >做firebase身份validation。

– >另外,检查数据是否存在于FirDatabase中

  FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "name"]).start { (connection, result, err) in let accessToken = FBSDKAccessToken.current() guard let accessTokenString = accessToken?.tokenString else {return} let credentials = FIRFacebookAuthProvider.credential(withAccessToken: accessTokenString) FIRAuth.auth()?.signIn(with: credentials, completion: { (user, error) in if error != nil { return } self.checkDataExistsinfirDataBaaseForUID(user.uid){ loginStaus in if(loginStaus){ // logged in self.performSegue(withIdentifier: "loginToRooms", sender: nil) }else{ // not logged in self.performSegue(withIdentifier: "showSetupScreen", sender: nil) } } }) if err != nil { return } } 

理想情况下,在设置页面之后,您必须在节点users – > uID下的FirebaseDatabase中添加设置信息。 所以检查这个方法是否存在这样的节点。

 func checkDataExistsinfirDataBaaseForUID(_ uid: String, completion: (result: Bool) -> Void) { let ref = FIRDatabase.database().reference().child("users").child(uid) ref.observeSingleEventOfType(.Value, withBlock: { (snapshot) in completion(snapshot.exists()) }) } 

testing用例 :

  1. 如果全新的用户点击login屏幕上的FBloginbutton,他们将进入设置屏幕。

达到的。

  1. 如果一个现有的,但注销的用户点击FBloginbutton,他们将绕过设置屏幕,并转到应用程序的第一页。

fblogin后 – > firbasevalidation – > Firdatabse节点检查 – >如果返回true->login到应用程序

  1. 如果现有用户注册,则永远不会注销,他们将永远不会再看到login或注册屏幕。

通过使用您的cehcking过程, FIRAuth.auth()?.addStateDidChangeListener {}