2016-07-27 14 views
1

過去にログインしている限り、ユーザーが自動的にアプリにログインするようにするより良い方法はありますか?安全でない可能性のあるストレージに直接ログインの詳細を保存する以外にも、iOSのFirebase自動ログイン

おかげ

PS:私は、iOS

EDITためFirebaseとスウィフトを使用しています:

@IBAction func logOutTapped(sender: AnyObject) { 
    try! FIRAuth.auth()?.signOut() 
    performSegueWithIdentifier("showLoginVC", sender: self) 
    print(FIRAuth.auth()?.currentUser?.displayName) 
} 
:ここで私はまた、ユーザーをログアウトするためにこれを使用

import UIKit 
import Firebase 

class loginVC: UIViewController { 

    @IBOutlet weak var emailTextField: UITextField! 
    @IBOutlet weak var passwordTextField: UITextField! 
    @IBOutlet weak var errorLabel: UILabel! 

    override func viewDidAppear(animated: Bool) { 
     automaticLogin() 
    } 

    @IBAction func loginTapped(sender: AnyObject) { 
     errorLabel.text = "" 
     FIRAuth.auth()?.createUserWithEmail(emailTextField.text!, password: passwordTextField.text!, completion: { 
      user, error in 
      if error != nil { 
       FIRAuth.auth()?.signInWithEmail(self.emailTextField.text!, password: self.passwordTextField.text!, completion: { (user, error) in 
        if error == nil { 
         self.login() 
        } else if error != nil { 
         self.errorLabel.text = ("Invalid email address or password") 
         print(error) 
        } 
       }) 
      } else { 
       print("user created") 
       self.login() 
       print(user?.displayName) 
      } 
     }) 
    } 

    @IBAction func forgotPasswordTapped(sender: AnyObject) { 
     let email = emailTextField.text 
     errorLabel.text = "" 

     FIRAuth.auth()?.sendPasswordResetWithEmail(email!) { error in 
      if error != nil { 
       self.errorLabel.text = ("Invalid email address") 
       print(error) 
      } else { 
       self.errorLabel.text = ("Password reset email successfully sent") 
       print("password reset email sent") 
      } 
     } 
    } 

    func login() { 
     FIRAuth.auth()?.signInWithEmail(emailTextField.text!, password: passwordTextField.text!, completion: { 
      user, error in 
      if error != nil { 
       self.errorLabel.text = ("Invalid email address or password") 
       print(error) 
      } else { 
       print("login successful") 
       self.checkIfUserIsNew() 
      } 
     }) 
    } 

    func checkIfUserIsNew() { 
     if FIRAuth.auth()?.currentUser?.displayName != nil || FIRAuth.auth()?.currentUser?.displayName == "" { 
      self.performSegueWithIdentifier("showChatVC", sender: self) 
     } else { 
      self.performSegueWithIdentifier("showOptionsVC", sender: self) 
     } 
    } 

    func automaticLogin() { 
     FIRAuth.auth()?.addAuthStateDidChangeListener { auth, user in 
      if user == user { 
       print("still signed in") 
      } else { 
       print("not signed in") 
      } 
     } 
    } 

コードです

+0

Firebase Docsをチェックしましたか?私が安全でないストレージに直接ログインするということはどういう意味ですか? –

+0

Firebase認証は、アプリケーションの実行の間にユーザーの認証トークンを保持します。 'addAuthStateDidChangeListener'を使用すると、既存のセッションを取得できます。 https://firebase.google.com/docs/auth/ios/manage-users#get_the_currently_signed-in_user –

+0

この機能を使用しようとしましたが、意図したとおりに動作しませんでした。オリジナルの投稿にコードを追加しました。 –

答えて

0

NSUserDefaultsを使用することができます。 login()関数でこれを行うには、ログインしたユーザーのデータを保存するか、アカウントを作成する必要があります。あなたのログイン機能の中で、あなたのユーザーの電子メール/パスワードを取得するために新しい変数を作成することから始めることができます。

let userDefaults = UserDefaults.standard 
userDefaults.setValue(self.emailField.text!, forKey: "email") 
userDefaults.setValue(self.passField.text!, forKey: "password") 

次に、あなたはまた、ビューコントローラの前に呼び出されますviewWillAppearと呼ばれる新しい機能を実装する必要があります。また、ログイン機能の中にいくつかの引数を入れることもできます。

override func viewWillAppear(_ animated: Bool) { 
    let userDefaults = UserDefaults.standard 

    if userDefaults.string(forKey: "email") != nil { 

     let email = userDefaults.string(forKey: "email") 

     let password = userDefaults.string(forKey: "password") 


     login(email: email!, password: password!) 

    } 
} 

ifステートメントは、ユーザーが既に自分のメールアカウントを登録しているかどうかを確認します。最後に、ユーザーの電子メールとパスワードを渡すために、2つのパラメータを持つようにログイン機能を更新する必要があります。

+1

さて、これは私が正確に行ったことです。しかし、userDefaultsにパスワードを格納することはお勧めできませんので、キーチェーンを使用することになりました。 –

関連する問題