0

これは、一般的な「どうやっていますか....」という問題ではなく、特定の問題です。私のアプリケーションでは、ユーザは電子メールとパスワードを使ってFirebaseアカウントにログインすることができます。その後、それらのフィールドをいくつかのフィールドを持つデータ入力ページに移動します。ユーザーがすでに存在する場合、そのデータは編集可能なフィールドにダウンロードされ、データベースに保存されます。Swift 3電子メールパスワードを使用したFirebaseユーザ認証/データベースログイン

このすべては、1つのことを除いてうまくいきます。私がテストしてアカウントにログインすると、ユーザーから既存のデータがダウンロードされます。ただし、別のユーザーでログアウトしてログインしても、以前のログイン情報が引き続きダウンロードされます(または表示されます)。ユーザーが実際に「FIRAuth.auth()?addStateDidChangeListener」を使用してログアウトしていることを確認しました。特定のデバイスに1人のユーザーがいる場合は問題ではありませんが、正しく動作していないことを嫌い、それを解決するのが良いでしょう。どんな助けでも大歓迎です - 多分私は何か明白なものを見逃していますか? :-)

かなりのコードがあるので、私はそれを少しだけカットしたが、主要な部分は残している。 (私が思う評判のビルダー!非常に迷惑な人)。

class UserLoginViewController: UIViewController { 

@IBOutlet weak var userNameLabel: UILabel! 
@IBOutlet weak var emailField: UITextField! 
@IBOutlet weak var passwordField: UITextField! 
@IBOutlet weak var logoutButton: UIButton! 

var ref: FIRDatabaseReference! 

override func viewDidLoad() { 
super.viewDidLoad() 

    ref = FIRDatabase.database().reference() 

//======Check if logged in, if so hide login button 
    if let user = FIRAuth.auth()?.currentUser 
    { 
     self.logoutButton.alpha = 1.0 
     self.userNameLabel.text = user.email 
    } 
    else 
    { 
     self.logoutButton.alpha = 0.0 
     self.userNameLabel.text = "" 
    } 
} 

//======LogIn 

@IBAction func loginAction(_ sender: AnyObject) 
{ 
    if self.emailField.text == "" || self.passwordField.text == "" 
    { 
     let alertController = UIAlertController(title: "Oops!", message: "Please enter an email and password.", preferredStyle: .alert)   
     let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil) 
     alertController.addAction(defaultAction) 

     self.present(alertController, animated: true, completion: nil) 
    } 
    else 
    { 
     FIRAuth.auth()?.signIn(withEmail: self.emailField.text!, password: self.passwordField.text!) { (user, error) in 
      if error == nil 
      { 
       self.logoutButton.alpha = 1.0 
       self.userNameLabel.text = user!.email 
       self.emailField.text = "" 
       self.passwordField.text = "" 
     // ===Segue to DataInput 
       self.performSegue(withIdentifier: "loginSegue",sender: nil) 
      } 
      else 
      { 
       let alertController = UIAlertController(title: "Oops!", message: error?.localizedDescription, preferredStyle: .alert) 
       let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil) 
       alertController.addAction(defaultAction) 
       self.present(alertController, animated: true, completion: nil) 
      } 
     } 
    } 
} 

これは、データエントリーページにリンク:

import UIKit 
import Firebase 

var ref: FIRDatabaseReference! 
let user = FIRAuth.auth()?.currentUser 

var myEmptyField = "" 
var myUid = user!.uid 

class DataInputViewController: UIViewController { 

@IBAction func unwindDataInputViewController(segue: UIStoryboardSegue) { 
} 

var newAccount: String! 
var myLon: String! 
var myLat: String! 


// ref user data on Firebase 
let ownernameRef = FIRDatabase.database().reference().child("https://stackoverflow.com/users/\(myUid)/ownername") 
let nameRef = FIRDatabase.database().reference().child("https://stackoverflow.com/users/\(myUid)/name") 
let typeRef = FIRDatabase.database().reference().child("users/\(myUid)/type") 

@IBOutlet weak var ownerNameTextField: UITextField! 
@IBOutlet weak var nameTextField: UITextField! 
@IBOutlet weak var areaTextField: UITextField! 
@IBOutlet weak var typeTextField: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 
// clearNull() 
} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    //reads database to viewcontroller 
    if newAccount == "no" { 

    self.ownernameRef.observe(.value) { (snap:FIRDataSnapshot) in self.ownerNameTextField.text = (snap.value as AnyObject).description} 
    self.nameRef.observe(.value) { (snap:FIRDataSnapshot) in self.nameTextField.text = (snap.value as AnyObject).description} 
    self.typeRef.observe(.value) { (snap:FIRDataSnapshot) in ion} 

      } 
    }else{ 
     if newAccount == "yes"{ 
      let date = Date() 
      let formatter = DateFormatter() 
      formatter.dateFormat = "dd.MM.yyyy" 
      let startDate = formatter.string(from: date) 

      accountSetupDateTextField.text = startDate 

     // clearNull() 
     } 
    } 

答えて

0

私はあなたが5ヶ月であなたの問題を解決しますが、おそらく他の人が答えを必要と思っています。

今日は同じ問題を抱えていたし、唯一私が見つけた解決は次のとおりです。

  • セット「させ、ユーザー= FIRAuth.auth()?。CurrentUserに」変数として「VAR」
  • 変更「VAR myUid =ユーザー! "へ "のvar myUid =文字列() "あなたのDataInputViewControllerのviewDidLoadメソッドで
  • を置く" nilをユーザー" あなたUserLoginViewControllerプットのviewDidLoadメソッドで
  • " =ユーザー= FIRAuth.auth(.UID )?currentUser "を追加し、" myUid = user!.uid "を追加します

この後はすべて私にとって完璧に機能します!

私はこの回答で誰かを助けることができます。

関連する問題