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