У меня все мои стручки правильно установлены. Мое приложение запускается, а затем, когда я добираюсь до сцен, которые имеют доступ к Firebase, я заметил, что произошел сбой. Причина, по-видимому, заключается в том, что Firebase выпускает мне 2 разных uid, а один в Auth не соответствует таковой в базе данных.Firebase выдает 2 разных uid -Swift iOS
Когда приложение запускается в 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'
Когда доступ пользователя! UID (от пользователя) Я получаю совершенно другой идентификатор пользователя от того, что первоначально в AppDelegate ,
Однако uid, который я получаю от пользователя в FIRAuth.auth() ?. createUserWithEmail - это то, что актуально в Auth, но не распознается в FirebaseDatabase.
Нечетная вещь - это uid, который напечатан в AppDelegate, то, что является текущим в базе FirebaseData, но не распознается в 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!)")
}
}
Вы настраиваете myUserID в методе приложение делегата так он по-прежнему использует это значение при доступе к базе данных. Измените значение, когда учетная запись создана/зарегистрирована в –
Это то, что вы сейчас делаете: 1. Как только приложение откроется, вы спросите firebase для uid 2.Firebase создает и представляет вам новый uid. Мы будем называть это UID1 3. Вы устанавливаете myUserID равным UID1 4. Вы создаете новую учетную запись 5. Firebase присваивает новый uid этой учетной записи. Мы будем называть это UID2 6. Вы получаете доступ к базе данных с использованием UID1, даже несмотря на то, что UID2 теперь зарегистрирован, потому что вы уже установили это значение. 7. Вы выходите из системы и спрашиваете, что означает текущий пользовательский идентификатор UID2 –
. Я понимаю ваша логика, и это делает полный смысл, за исключением 1 вещи (а не вашей логики, кроме Firebase). Ваше высказывание в AppDelegate Я устанавливаю myUserID в UID1, и я предполагаю, что это задано константой let. Однако я не пытался использовать этот код, полностью удалив все, что означает, что я никогда не устанавливал его. Проблема все еще возникает. Далее в проекте myUserId никогда не бывает так же, как тот, который создан в user! Uid. У меня есть другие vc, которые идут по линии после успешной регистрации, и я использую FIRAuth.auth() ?. currentUser? .uid, чтобы получить uid, и это несоответствие. –