2016-09-18 10 views
0

У меня все мои стручки правильно установлены. Мое приложение запускается, а затем, когда я добираюсь до сцен, которые имеют доступ к 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!)") 

    } 
} 

ответ

1

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

Удалить код из App делегата и двигаться "пусть myUserID = FIRAuth.auth() ?. CurrentUser? .uid" в функцию 'createUserWithEmail' в контроллере Регистрация

+0

Вы настраиваете myUserID в методе приложение делегата так он по-прежнему использует это значение при доступе к базе данных. Измените значение, когда учетная запись создана/зарегистрирована в –

+0

Это то, что вы сейчас делаете: 1. Как только приложение откроется, вы спросите firebase для uid 2.Firebase создает и представляет вам новый uid. Мы будем называть это UID1 3. Вы устанавливаете myUserID равным UID1 4. Вы создаете новую учетную запись 5. Firebase присваивает новый uid этой учетной записи. Мы будем называть это UID2 6. Вы получаете доступ к базе данных с использованием UID1, даже несмотря на то, что UID2 теперь зарегистрирован, потому что вы уже установили это значение. 7. Вы выходите из системы и спрашиваете, что означает текущий пользовательский идентификатор UID2 –

+0

. Я понимаю ваша логика, и это делает полный смысл, за исключением 1 вещи (а не вашей логики, кроме Firebase). Ваше высказывание в AppDelegate Я устанавливаю myUserID в UID1, и я предполагаю, что это задано константой let. Однако я не пытался использовать этот код, полностью удалив все, что означает, что я никогда не устанавливал его. Проблема все еще возникает. Далее в проекте myUserId никогда не бывает так же, как тот, который создан в user! Uid. У меня есть другие vc, которые идут по линии после успешной регистрации, и я использую FIRAuth.auth() ?. currentUser? .uid, чтобы получить uid, и это несоответствие. –

0

Проблема решена. Вот новый код через @Justin Доан «s принятый ответ

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