处理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:
- 如果新用户点击Facebookloginbutton,他们将被带到注册屏幕。
- 如果注册(但注销)的用户点击Facebookloginbutton,他们将直接进入应用程序。
- 如果注册的,仍然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用例 :
- 如果全新的用户点击login屏幕上的FBloginbutton,他们将进入设置屏幕。
达到的。
- 如果一个现有的,但注销的用户点击FBloginbutton,他们将绕过设置屏幕,并转到应用程序的第一页。
fblogin后 – > firbasevalidation – > Firdatabse节点检查 – >如果返回true->login到应用程序
- 如果现有用户注册,则永远不会注销,他们将永远不会再看到login或注册屏幕。
通过使用您的cehcking过程, FIRAuth.auth()?.addStateDidChangeListener {}
- 如何在新iTuneconnect中创build应用内购买testing用户?
- 我可以在iPhone应用程序上使用Facebook身份validation服务器端stream程,并仍然有客户端的交互?
- 暴露Rails /deviseauthentication到iOS应用程序
- 如何在UIWebView中正确地进行身份validation?
- 如何在离线时将数据写入Firebase? Swift3
- 找不到-lGTMSessionFetcher的库
- 使用后端Spring Security Java EE服务器和前端iOS Objective-C客户端进行身份validation
- 未经身份validation的用户在AWS Cognito上authentication用户
- 如何从一个使用firebase设置的IOS应用程序读取/写入另一个Firebase项目中包含的另一个Firebase数据库? Swift 3