Firebase 发出 2 个不同的 uid -Swift iOS

Firebase issuing out 2 different uid's -Swift iOS

我已经正确安装了所有 pods。我的应用程序启动,然后当我到达必须访问 Firebase 的场景时,我注意到发生了崩溃。原因似乎是 Firebase 向我发出了 2 个不同的 uid,而 Auth 中的 uid 与数据库中的不匹配。

当我的应用程序在 AppDelegate 中启动时,我有获取当前 uid 的代码。

//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(来自用户)时,我得到一个与 AppDelegate 中最初的完全不同的 uid。

然而,我在 FIRAuth.auth()?.createUserWithEmail 中从用户那里获得的 uid 是当前在 Auth 中的,但在 FirebaseDatabase 中无法识别。

奇怪的是,在 AppDelegate 中打印的 uid 是 FirebaseDatabase 中的当前值,但在 Auth 中无法识别。如果这个 uid 在注册时被更改,那么它在数据库中不应该可用

我也有一个注销场景,当我按下注销按钮时,我得到的注销 uid 与在 FIRAuth.auth()?.createUserWithEmail

中创建的相同

知道为什么我有两个不同的 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
    }

注册控制器

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

  }
}

您要求 firebase 在应用程序委托中提供一个 uid,而不检查用户是否已登录。它可能会向用户分配一个 temporary/anonymous 帐户,直到他们创建一个帐户。检查 firebase 控制台中的 "Auth" 设置,查看是否在此过程中创建了多个帐户。

从 App Delegate 中删除代码并将 "let myUserID = FIRAuth.auth()?.currentUser?.uid" 移动到注册控制器中的 'createUserWithEmail' 函数中

问题已解决。这是来自@Justin Doan 接受的答案的新代码

A​​ppDelegate

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
    }

注册控制器

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 没有变化