我是 Swift 和 Firebase 的新手。我正在尝试使用 facebook 登录构建一个应用程序。我已经实现了一些代码并尝试学习本教程,但我并不真正了解如何保存登录名并“了解”当前用户数据。所以我尝试在登录方法中实现此代码并保存用户 ID
NSUserDefaults.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!
}
登录后会移动到其他 View 并显示用户名。我使用这段代码来检索用户名数据
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)
})
}
但是,每次我登录时,它都会显示此错误 fatal error :在展开可选值时意外发现 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 如何为当前用户工作,我是否需要在每个页面中编写任何代码来检查当前用户数据以检索数据?请修改我的代码以加深对这个问题的理解。
最佳答案
如果目标是对用户进行身份验证,并且如果验证成功,则将他们的登录凭据存储在设备本地,这非常简单。
登录过程因提供商而异(确保它已在您的 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 指南中找到有关此主题的更多信息部分,以及示例代码。
关于swift - Facebook 登录和当前用户后的 Firebase 和 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35968217/