2016-07-27 3 views
1

과거에 로그인 한 상태에서 사용자가 앱에 자동으로 로그인하도록하는 더 좋은 방법이 있습니까? 안전하지 않을 수도있는 저장소에 로그인 세부 정보를 직접 저장하는 것 외에는?iOS에서 Firebase 자동 로그인

감사

PS : 나는 아이폰 OS

편집에 대한 중포 기지와 스위프트을 사용하고 있습니다 :

@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 문서를 확인 했습니까? 내게 안전하지 않은 저장소에 직접 로그인 세부 정보가 있다는 것은 무엇을 의미합니까? –

+0

Firebase 인증은 앱 실행 사이에 사용자의 인증 토큰을 유지합니다. 'addAuthStateDidChangeListener'를 사용하면 기존 세션을 선택할 수 있습니다. https://firebase.google.com/docs/auth/ios/manage-users#get_the_currently_signed-in_user –

+0

해당 기능을 사용해 보았지만 의도 한대로 작동하지 않았습니다. 원래 코드에 코드를 추가했습니다. –

답변

0

NSUserDefaults를 사용할 수 있습니다. login() 함수에서이를 수행하려면 사용자가 로그인하거나 계정을 만들면 사용자의 데이터를 저장하는 것이 좋습니다. 로그인 기능에서 새로운 변수를 생성하여 사용자의 이메일/비밀번호를 가져 오기 시작할 수 있습니다.

다음으로 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 문은 사용자가 이미 자신의 이메일 계정을 등록했는지 여부를 확인합니다. 마지막으로 두 가지 매개 변수를 갖도록 로그인 기능을 업데이트하여 사용자의 이메일과 비밀번호를 전달해야합니다.

+1

예, 이것이 정확하게 수행 한 것입니다. 그러나 userDefaults에 암호를 저장하는 것은 권장되지 않으므로 키 체인을 사용하게되었습니다. –