我的所有豆莢都已正確安裝。我的應用程序啓動,然後當我到達必須訪問Firebase的場景時,我注意到發生了崩潰。原因似乎是,Firebase向我發放了2個不同的uid,而Auth中的那個與數據庫中的不匹配。Firebase發出2個不同的uid's -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'
下一個註冊的場景呈現,並在該視圖控制器我有
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獲得的uid是Auth中的當前內容,但未在FirebaseDatabase中識別。
奇怪的是,在AppDelegate中打印的uid是FirebaseDatabase中的當前內容,但在Auth中無法識別。如果這個uid在註冊時改變了,那麼它不應該在數據庫中可用
我也有一個註銷場景,當我按下注銷按鈕時,我得到的註銷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.一旦應用程序打開,你問火力基地爲一個uid 2。Firebase會創建並向您展示一個新的uid。我們稱之爲UID1 3.您將myUserID設置爲等於UID1 4.您創建一個新帳戶 5. Firebase爲該帳戶分配一個新的uid。我們稱之爲UID2 6.即使UID2現在已經登錄,您也可以使用UID1訪問數據庫,因爲您已經設置了該值 7.您註銷並詢問當前用戶的uid是什麼,這是我理解的UID2 –
你的邏輯,除了1件事情(不是你的邏輯,而是Firebase的)之外,它是完全合理的。你在AppDelegate中的說法我將myUserID設置爲UID1,我假設這是由常量設置的。但是我試圖完全刪除整個東西,這意味着我從來沒有設置它,所以我完全沒有使用該代碼。問題仍然存在。在這個項目中,myUserId與用戶!uid中創建的不一樣。我還有其他的vc在成功註冊後走到了線下,我使用FIRAuth.auth()?currentUser?.uid來獲取uid,這是不匹配的。 –