2017-01-27 3 views
-1

Я использую логин с помощью Facebook с помощью Firebase, у меня есть этот код, который выполняет поиск в моей базе данных после успешной проверки подлинности для электронной почты для электронной почты, если она существует в базе данных и регистрируется в приложении, если она найдена, я хочу направить пользователя на контроллер просмотра регистрации, если он не найден, но не работает, поскольку этот метод является асинхронным. Я ценю, если кто-то может помочь. Вот мой код:Facebook с использованием Firebase - Swift iOS

func getFacebookUserInfo() { 
    if(FBSDKAccessToken.current() != nil){ 
     let graphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "id,name,gender,email,education"]) 
     let connection = FBSDKGraphRequestConnection() 
     connection.add(graphRequest, completionHandler: { (connection, result, error) -> Void in 
      let data = result as! [String : AnyObject] 
      let email = data["email"] as? String 

      let emailRef = FIRDatabase.database().reference().child("usernameEmailLink") 
      emailRef.queryOrderedByValue().observe(.childAdded, with: { snapshot in 
       if let snapshotValue = snapshot.value as? [String: AnyObject] { 
        for (key, value) in snapshotValue { 

         if(value as? String == email){ 
          self.stringMode = snapshotValue["mode"]! as! String 
          self.username = key 
          self.parseUserInfoFromJSON() 
          return 
         } 

        } 
       } 

      }) 


     }) 
     connection.start() 

    } 

} 

спасибо.

+1

Вопрос немного неясен, поэтому трудно ответить. Если пользователь аутентифицируется с помощью проверки подлинности Facebook, они аутентифицируются - зачем вам искать их электронную почту? то есть API Firebase Facebook создает пользователь Firebase. См. Шаги 4 и 5 в статье [Проверка подлинности в Интернете] (https://firebase.google.com/docs/auth/ios/facebook-login) – Jay

+0

@Jay мое приложение требует регистрации пользователя – Reem

+0

Это не совсем понятно, что это значит, но я создал ответ, который может быть тем, что вы ищете. – Jay

ответ

3

Регистрация/существование пользователя в Firebase, вероятно, должна быть определена перед кодом graphRequest в вопросе.

Самое главное, (и это важно), адреса электронной почты являются динамическими, поэтому они не должны использоваться для проверки наличия пользователя. то есть пользователь с адресом электронной почты '[email protected]' обновляет свое письмо на адрес [email protected] Если электронные письма используются для проверки регистрации, он может полностью нарушиться, если это сообщение изменится.

Пожалуйста, используйте Firebase uid для этой цели, поскольку они являются статическими и уникальными.

Поскольку у нас есть только небольшой фрагмент кода, мы не знаем, какая именно последовательность используется. Этот ответ является псевдокодом, чтобы описать возможную последовательность.

Мы предполагаем, что «зарегистрированным» означает, что пользователь прошел через какую-либо регистрационную последовательность приложений, и пользователь был создан (и теперь существует/зарегистрирован) в Firebase.

В общем, была бы кнопка входа в систему и метод делегата для обработки действительного действия входа.

Пользователь вводит свой логин и отводы кнопку входа

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

Firebase может затем получить учетные данные для этого пользователя (см Firebase DOC цитата ниже)

let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString) 

В этот момент подписать в пользователь и проверьте, зарегистрированы ли они (существуют) в пользовательском узле Firebase.

FIRAuth.auth()?.signIn(with: credential) { (user, error) in 
    if let error = error { //failed due to an error 
    return 
    } 

    let uid = user.uid //the firebase uid 
    let thisUserRef = userRef.child(uid) //a reference to the user node 

    //check to see if the user exists in firebase (i.e. is Registered) 
    thisUserRef.observeSingleEvent(of: .value, with: { (snapshot) in 

    //if snapshot exists 
     //then the user is already 'registered' in the user node 
     // so continue the app with a registered user 
    //if not, then need to have the user go through a registration sequence and 
    // then create the user (make them registered) in the user node 
     doRegisterUser(user) 
    }) 


func doRegisterUser(user: FIRUser) { 

    //get what you need from the user to register them 
    // and write it to the users node. This could be from additional 
    // questions or from their Facebook graph, as in the code in the 
    // question 

    //for this example, we'll just write their email address 
    let email = user.email 
    let dict = ["email": email] 

    //create a child node in the users node with a parent of uid 
    // and a child of email: their email 
    thisUserRef.setValue(node) 

    //next time the user logs in via FB authentication, their user node 
    // will be found as they are now a 'registered' user 
} 

Из Firebase Docs

После того, как пользователь в первый раз, новая учетная запись пользователя создан и связан с мандатным-то есть, имя пользователя и пароля, или информацию об автоответчике, с которой пользователь вступил. Это нового счета хранится как часть вашего Firebase проекта, и может быть используется для идентификации пользователя через каждое приложение в вашем проекте, независимо того, как знаки пользователя в.

Как я уже говорил, это очень псевдокод, но предлагает возможную последовательность для решения.

+0

Отлично. Это имеет смысл, так как Firebase Signin через Facebook работает как в качестве регистра, так и для входа в систему, поэтому нет встроенного способа выяснить, входит ли пользователь в первый раз или просто возвращающийся пользователь. – Annjawn

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