2016-03-13 2 views
1

Я новичок в 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 будет работать для текущего пользователя и мне нужно писать код на каждой странице, чтобы проверить текущие пользовательские данные для получения данных? Пожалуйста, измените мой код, чтобы узнать больше об этом.

ответ

-1

Если целью является аутентификация пользователя, и если это будет успешным, сохраните свои учетные данные локально на устройстве, это довольно просто.

Процесс регистрации зависит от поставщика (убедитесь, что он включен в панели управления Firebase), но все они имеют одинаковый поток.

После аутентификации переменная authData содержит информацию об этом конкретном пользователе. Свойством uid объекта FAuthData является то, как вы однозначно идентифицируете пользователя.

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

Переходя от этого, вы, вероятно, хотите создать/пользователи узел в Firebase, который содержит другую информацию о пользователе

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

Вы можете найти намного больше информации по этой теме на Руководство Firebase в разделе User Authentication, а также пример кода.

Смежные вопросы