2016-03-13 59 views
1

我是Swift和Firebase的新用户。我正在尝试使用Facebook登录名创建应用程序。我已经实现了一些代码并尝试学习本教程,但我并不真正了解如何登录可以保存和“知道”当前用户数据。所以我试图实现的登录方法此代码并保存用户ID
NSUserDefaults.standardUserDefaults().setValue(result ["uid"], forKey: "uid")Facebook登录和当前用户的Firebase和Swift

这:

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

} 

但是,每次我登录,它会显示这个错误致命错误时间:意外发现零,同时展开与彰显REF_USER_CURRENT一个可选值。我认为这是因为它无法在NSUserDefault中保存uid。这是我的登录方法

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 = "[email protected]" 
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") 
    } 
} 

从移动的,你可能会想创建/用户火力地堡中的节点包含有关用户的其他信息

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

你可以找到关于这个话题更多的信息User Authentication部分中的Firebase指南以及示例代码。