Facebook 登录和当前用户之后的 Firebase 和 Swift

Posted

技术标签:

【中文标题】Facebook 登录和当前用户之后的 Firebase 和 Swift【英文标题】:Firebase and Swift After Facebook Login and current user 【发布时间】:2016-03-13 08:34:08 【问题描述】:

我是 Swift 和 Firebase 的新手。我正在尝试使用 facebook 登录构建一个应用程序。我已经实现了一些代码并尝试学习本教程,但我并不真正了解如何保存登录名并“了解”当前用户数据。所以我尝试在登录方法中实现这段代码并保存用户IDNSUserDefaults.standardUserDefaults().setValue(result ["uid"], forKey: "uid")

还有这个:

 var REF_USER_CURRENT: Firebase 
    let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as! String
    let currentUser = Firebase(url: "\(baseUrl)").childByAppendingPath("users").childByAppendingPath(userID)
    return currentUser!

登录后它会移动到其他视图并显示用户名。我使用此代码检索用户名数据

   func displayName()  

    FirebaseHelper.fbh.REF_USER_CURRENT.observeEventType(.Value, withBlock: 
        snapshot in
        let currentUser = snapshot.value.objectForKey("name") as! String
        self.currentUsername = currentUser
        self.facebookUserName.text = currentUser as String
        print("Username: \(currentUser)")
        , withCancelBlock:  error in
            print(error.description)
    )


但是,每次我登录时,它都会显示此错误致命错误:在展开可选值时意外发现 nil 并突出显示 REF_USER_CURRENT。我认为原因是它可能无法将 uid 保存在 NSUserDefault 中。这是我的登录方式

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) 

    if error != nil
        print("Facebook login failed. Error \(error)")
    else if result.isCancelled 
        print("Facebook login was cancelled")
    else if result.grantedPermissions.contains("email")
          let accessToken = FBSDKAccessToken.currentAccessToken().tokenString
        FirebaseHelper.fbh.REF_BASE.authWithOAuthProvider("facebook", token: accessToken, withCompletionBlock:  error, authData in

            if(error != nil)
                print("Login failed. \(error)")
            else
                print("Logged in! \(authData)")
                self.saveUserToFirebase(authData)
                print("User Saved Successfully! \(authData.uid)")
                self.processLogin(accessToken, authData: authData)
                let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("profileSetup") as! UIViewController
                self.presentViewController(viewController, animated: true, completion: nil)


            

        )
    



   func processLogin(accessToken: String, authData: FAuthData) 
    FirebaseHelper.fbh.REF_USER_CURRENT.childByAppendingPath(authData.uid).observeSingleEventOfType(.Value, withBlock:  snapshot in
        if snapshot.value is NSNull 
            print("fail")
         else 
            print("no")
        
    )



private func createUser(authData: FAuthData!)

    let displayName = authData.providerData["displayName"] as! String
    let email = authData.providerData["email"] as! String
    var imageUrl = ""

    if let url = authData.providerData["profileImageURL"] as? String 
        imageUrl = url
    

    let request = FBSDKGraphRequest(graphpath: "me/picture", parameters: ["fields": "url", "redirect": false, "type": "large"], HTTPMethod: nil)
    request.startWithCompletionHandler  connection, result, facebookerror in

        if facebookerror != nil
            print("Graph API Call failed. \(facebookerror)")
        else

            //let userData = (result as! NSDictionary).copy()

            let user = ["name": displayName, "email": email,"profilePicUrl": imageUrl]
            FirebaseHelper.fbh.createFirebaseUser(authData.uid, user: user)
            if facebookerror != nil
                print("Error occured! \(facebookerror)")
            else
                print("User Saved Successfully! \(authData.uid) \(displayName)")
                NSUserDefaults.standardUserDefaults().setValue(result ["uid"], forKey: "uid")


            
            self.facebookLoginBtn.hidden = true
        
    


我不明白 NSUserdafult 如何为当前用户工作,我是否需要在每个页面中编写任何代码来检查当前用户数据以检索数据?请修改我的代码以便对这个问题有更多的理解。

【问题讨论】:

【参考方案1】:

如果目标是对用户进行身份验证,并且如果成功,则将他们的登录凭据存储在本地设备上,这非常简单。

登录过程因提供商而异(确保已在您的 Firebase 仪表板中启用),但它们都有相同的流程。

一旦通过身份验证,authData 变量就会包含有关该特定用户的信息。 FAuthData 对象上的 uid 属性是您唯一标识用户的方式。

let email = "dude@thing.com"
let pw = "password"

ref.authUser(email, pw) 
    error, authData in

    if error != nil 
        // eh, something went wrong, handle it

     else 

       let myAppData = NSUserDefaults.standardUserDefaults()
       myAppData.setValue(auth.uid, forKey: "uid")
       myAppData.setValue(email, forKey: "email")
       myAppData.setValue(pw, forKey: "password")
    

接下来,您可能希望在 Firebase 中创建一个 /users 节点,其中包含有关用户的其他信息

users
  uid_0
   name: "Pete"
   shoe_size: "13"
  uid_1
   name: "Larry"
   shoe_size: "2"

您可以在 User Authentication 部分的 Firebase 指南中找到有关此主题的更多信息以及示例代码。

【讨论】:

以上是关于Facebook 登录和当前用户之后的 Firebase 和 Swift的主要内容,如果未能解决你的问题,请参考以下文章

维护用户会话(在 Facebook O-Auth、服务器端登录之后)

将 Facebook 登录与 Parse 集成

如何从 facebook 应用程序注销用户,但保持从 facebook 登录

使用 Facebook 登录我的应用

iPhone应用程序,如何避免要求用户重新登录Facebook

我的 facebook 登录对话框在我当前的模式视图下弹出。现在做啥?