Я новичок в Swift и Firebase. Я пытаюсь создать приложение с логином facebook. Я реализую некоторый код и стараюсь учиться на учебнике, но я не совсем понимаю, как логин может сохранять и «знать» текущие пользовательские данные. Так что я пытался реализовать этот код в методе входа и сохранить идентификатор пользователя
NSUserDefaults.standardUserDefaults().setValue(result ["uid"], forKey: "uid")
Firebase и Swift After Facebook Логин и текущий пользователь
и это:
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. Я думаю, причина в том, что она не может, вероятно, сохранить 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 будет работать для текущего пользователя и мне нужно писать код на каждой странице, чтобы проверить текущие пользовательские данные для получения данных? Пожалуйста, измените мой код, чтобы узнать больше об этом.