2016-09-18 19 views
0

我的所有豆莢都已正確安裝。我的應用程序啓動,然後當我到達必須訪問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!)") 

    } 
} 

回答

1

你問火力在應用程序委託一個UID沒有,如果用戶登錄檢查。這可能會爲用戶分配一個臨時/匿名帳戶,直到他們創建一個帳戶。檢查Firebase控制檯中的「Auth」設置,看看是否正在創建多個帳戶。

從App代表取出代碼和移動「讓myUserID = FIRAuth.auth()?currentUser?.uid」到在註冊控制器對應createUserWithEmail'功能

+0

您應用程序的委託方法中設置myUserID沒有變化所以它在訪問數據庫時仍然使用該值。更改帳戶創建/登錄時的值 –

+0

這就是你在做什麼: 1.一旦應用程序打開,你問火力基地爲一個uid 2。Firebase會創建並向您展示一個新的uid。我們稱之爲UID1 3.您將myUserID設置爲等於UID1 4.您創建一個新帳戶 5. Firebase爲該帳戶分配一個新的uid。我們稱之爲UID2 6.即使UID2現在已經登錄,您也可以使用UID1訪問數據庫,因爲您已經設置了該值 7.您註銷並詢問當前用戶的uid是什麼,這是我理解的UID2 –

+0

你的邏輯,除了1件事情(不是你的邏輯,而是Firebase的)之外,它是完全合理的。你在AppDelegate中的說法我將myUserID設置爲UID1,我假設這是由常量設置的。但是我試圖完全刪除整個東西,這意味着我從來沒有設置它,所以我完全沒有使用該代碼。問題仍然存在。在這個項目中,myUserId與用戶!uid中創建的不一樣。我還有其他的vc在成功註冊後走到了線下,我使用FIRAuth.auth()?currentUser?.uid來獲取uid,這是不匹配的。 –

0

問題解決了。以下是通過@Justin杜安的接受的答案新代碼

的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