Firebase выдает 2 разных uid -Swift iOS

У меня все мои модули установлены правильно. Мое приложение запускается, а затем, когда я попадаю в сцены, которые имеют доступ к Firebase, я замечаю, что происходит сбой. Кажется, причина в том, что Firebase выдает мне 2 разных идентификатора пользователя, и тот, что в Auth, не совпадает с тем, что в Базе данных.

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

//This is in App Delegate
let myUserID = FIRAuth.auth()?.currentUser?.uid

print("App Delegate: UID is \(myUserID!)")
//An example print is 'App Delegate: UID is Abcdefg12345'

Далее сцена SignUp представлена ​​и в этом контроллере представления у меня есть

FIRAuth.auth()?.createUserWithEmail(self.emailTextField.text!, password: self.passwordTextField.text!, completion: {

            //You can access the newly issued uid from user via user!uid
            (user, err) in

print("SignUp: UID is \(user!uid)\n")
//An example print is 'SignUp: UID is Vwxyz67890'

Когда я получаю доступ к user! Uid (от пользователя), я получаю совершенно другой uid от того, который изначально был в AppDelegate.

Однако uid, который я получаю от пользователя в FIRAuth.auth()?.createUserWithEmail, является текущим в Auth, но не распознается в FirebaseDatabase.

Странным является то, что uid, который печатается в AppDelegate, это то, что является текущим в FirebaseDatabase, но не распознается в Auth. Если этот идентификатор изменился при регистрации, он не должен быть доступен в базе данных

У меня также есть сцена выхода из системы, и когда я нажимаю кнопку выхода из системы, я получаю UID выхода из системы, такой же, как в FIRAuth.auth()?.createUserWithEmail

Любые идеи, почему у меня есть 2 разных UID? Кажется, это мои проблемы с авариями.

AppDelegate

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage
import GoogleMaps

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    override init() {
        super.init()

        //Configure App for FireBase
        FIRApp.configure()

        //Firebase App Offline Updates
        FIRDatabase.database().persistenceEnabled = true

        GMSServices.provideAPIKey("mykey")
    }//end override init


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        let myUserID = FIRAuth.auth()?.currentUser?.uid

        let connectedRef = FIRDatabase.database().referenceWithPath(".info/connected")
        connectedRef.observeEventType(.Value, withBlock: { 
                    (connected) in

        if let boolean = connected.value as? Bool where boolean == true {
                print("\nApp Delegate: Firebase is connected")

                if myUserID != nil{
                //This uid is different from the one created in signUp but yet it is what's shown in the Database but not Auth
                print("App Delegate: UID is \(myUserID!)\n")
                }
            } else {
                print("\nApp Delegate: Firebase is NOT connected\n")
            }
        })

self.window?.makeKeyAndVisible()

        return true
    }

SignUpController

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseCrash

class SignUpController: UIViewController {

@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!

var dbRef: FIRDatabaseReference!
let myUserID = FIRAuth.auth()?.currentUser?.uid


override func viewDidLoad() {
      super.viewDidLoad()
self.dbRef = FIRDatabase.database().reference()
}

@IBAction func signUpButton(sender: UIButton) {

FIRAuth.auth()?.createUserWithEmail(self.emailTextField.text!, password: self.passwordTextField.text!, completion: {

            (user, err) in

//This uid is different from AppDelegate but is what is shown in Auth but not in Database
print("\nSignUp: UID is \(user!uid)\n")
print("Now Look at the UID printed from the above property myUserID: \(self.myUserID)")

if err != nil{
        print((error?.localizedDescription)\n)
       }

let usersRef = self.dbRef.child("users")
let userIDRef = usersRef.child(self.myUserID!)
let userEmailRef = userIDRef.child("userEmailRef")

let email = self.self.emailTextField.text!
let dict = [String:AnyObject]()
dict.updateValue(email, forKey: "emailKey")
dict.updateValue(self.myUserID!, forKey: "userIDKey")

userEmailRef.updateChildValues(dict, withCompletionBlock: {

                (error, user) in

                if error != nil{
                    print(err?.localizedDescription\n")
                }
     })
   })
 }
}

LogoOutController

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseCrash

class LogoutController: UIViewController {

var dbRef: FIRDatabaseReference!
let myUserID = FIRAuth.auth()?.currentUser?.uid


override func viewDidLoad() {
      super.viewDidLoad()
self.dbRef = FIRDatabase.database().reference()
}


@IBAction func signUpButton(sender: UIButton) {

try! FIRAuth.auth()!.signOut()

print("\nLogout: UID is \(self.myUserID!)")

  }
}

2 ответа

Решение

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

Удалите код из делегата приложения и переместите "let myUserID = FIRAuth.auth()?.currentUser?.Uid" в функцию "createUserWithEmail" в контроллере регистрации.

Задача решена. Вот новый код через принятый ответ @Justin Doan

AppDelegate

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage
import GoogleMaps

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    override init() {
        super.init()

        //Configure App for FireBase
        FIRApp.configure()

        //Firebase App Offline Updates
        FIRDatabase.database().persistenceEnabled = true

        GMSServices.provideAPIKey("mykey")
    }//end override init


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        let connectedRef = FIRDatabase.database().referenceWithPath(".info/connected")
        connectedRef.observeEventType(.Value, withBlock: { 
                    (connected) in

        if let boolean = connected.value as? Bool where boolean == true {
                print("\nApp Delegate: Firebase is connected")
            } else {
                print("\nApp Delegate: Firebase is NOT connected\n")
            }
        })

self.window?.makeKeyAndVisible()

        return true
    }

SignUpController

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseCrash

class SignUpController: UIViewController {

@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!

var dbRef: FIRDatabaseReference!

override func viewDidLoad() {
      super.viewDidLoad()
self.dbRef = FIRDatabase.database().reference()
}

@IBAction func signUpButton(sender: UIButton) {

FIRAuth.auth()?.createUserWithEmail(self.emailTextField.text!, password: self.passwordTextField.text!, completion: {

            (user, err) in

let myUserID = FIRAuth.auth()?.currentUser?.uid

//This should always print a successful match
if user!.uid != currentUserID{
            print("\nYOUR USER ID'S DON'T MATCH")
        }else{
            print("\nTHE USER ID's SUCCESSFULLY MATCH")
        }

if err != nil{
        print((error?.localizedDescription)\n)
       }

let usersRef = self.dbRef.child("users")
let userIDRef = usersRef.child(self.myUserID!)
let userEmailRef = userIDRef.child("userEmailRef")

let email = self.self.emailTextField.text!
let dict = [String:AnyObject]()
dict.updateValue(email, forKey: "emailKey")
dict.updateValue(self.myUserID!, forKey: "userIDKey")

userEmailRef.updateChildValues(dict, withCompletionBlock: {

                (error, user) in

                if error != nil{
                    print(err?.localizedDescription\n")
                }
     })
   })
 }
}

Там нет изменений в LogoutController

Другие вопросы по тегам