これは、一般的な「どうやっていますか....」という問題ではなく、特定の問題です。私のアプリケーションでは、ユーザは電子メールとパスワードを使って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()
}
}