Как автоматически войти в систему в iOS swift?

Я использую аутентификацию телефона с помощью облачного firestore. В firestore db я сохраняю номер телефона пользователя и uid. Вот код, который я пробовал для входа в мобильный номер:

  @IBAction func signUp(_ sender: Any) {
    // dismiss keyboard
    view.endEditing(true)   
    if sendOTP == false {
    let mobileNumber = "+91" + phoneNumberTextField.text!

    self.Userdefaults.set(mobileNumber, forKey: "mobileNumber")

    print("mobileNumber::::\(mobileNumber)")

    sendOTPCode()
    sendOTP = true

    } else {

        let codestring = OTPCodeTextField.text

        if codestring?.count == 6 {


            loginusingOTP(OTPtext: codestring!)


        } else {

            print("Enter 6 digit code")

        }

    }


func sendOTPCode() {

    let mymobilenumber = Userdefaults.string(forKey: "mobileNumber")
    PhoneAuthProvider.provider().verifyPhoneNumber(mymobilenumber!) { (verificationID, error) in


            self.Userdefaults.set(verificationID, forKey: "authVerificationID")

            if error != nil
            {
                print ("insde SendCode, there is error")



                print("error: \(String(describing: error?.localizedDescription))")

            } else {
                print ("code sent")


                self.phoneNumberTextField.allowsEditingTextAttributes = false



            }
    }

}

func loginusingOTP(OTPtext: String) {
    let db = Firestore.firestore()
    let verificationID = self.Userdefaults.string(forKey: "authVerificationID")

    let credential: PhoneAuthCredential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID!,
                                                                                  verificationCode: OTPtext)
    Auth.auth().signIn(with: credential)
    {
        (user, error) in
        if error != nil
        {
            print("error: \(String(describing: error?.localizedDescription))")
        }
        else if user != nil
        {

            print("Phone number: \(String(describing: user?.phoneNumber))")
            let userInfo = user?.providerData[0]
            print("Provider ID: \(String(describing: userInfo?.providerID))")

            var _: DocumentReference? = nil

            print("currentUser:::\(String(describing: currentUser))")

            db.collection("users").document(currentUser!).setData([
                "User_Phone_number": user?.phoneNumber as Any,
                "uid": currentUser as Any

            ]) { err in
                if let err = err {
                    print("Error writing document: \(err)")
                } else {
                    print("Document successfully written!")
                    if PrefsManager.sharedinstance.isFirstTime == false{


                        let when = DispatchTime.now() + 0
                        DispatchQueue.main.asyncAfter(deadline: when) {

                            self.performSegue(withIdentifier: "signUpToTabBar", sender: nil)

                        }


                    }else{
                        let when = DispatchTime.now() + 0
                        DispatchQueue.main.asyncAfter(deadline: when) {


                            let storyboard = UIStoryboard(name: "Start", bundle: nil)
                            let initialViewController = storyboard.instantiateViewController(withIdentifier: "onboardvc")
                            self.present(initialViewController, animated: true, completion: nil)

                        }
                    }



                }
            }

        } else {

            print("error::::::")

        }

    }

}

Вход в систему пользователя - первый пользователь вводит номер телефона, а затем отбирает при отправке otp, тогда пользователь вводит otp-код, успешно вступил в систему. После первого входа пользователя пользователю необходимо заполнить страницу сведений о пользователе, а затем перейти на домашнюю страницу. Если его уже зарегистрированный пользователь, после успешного входа пользователя, пользователь перенаправит на главный экран страницу пользователя.

Мой вопрос заключается в том, что теперь пользователь вводит логин каждый раз, чтобы войти в приложение, я хочу, чтобы пользователь автоматически входил в систему без входа в систему каждый раз, если пользователь не вышел из системы. Как проверить уже зарегистрированный пользовательский UID или телефон в облачном firestore для пользователя или нового пользователя.

Любая помощь очень ценит PLS...

Ответы

Ответ 1

Позвольте мне кратко рассказать.

SwiftyUserDefaults - лучшая библиотека для хранения UserDefaults во всем приложении.

Создайте одно расширение, подобное этому,

extension DefaultsKeys {
    static let username = DefaultsKey<String?>("username")
    static let phoneNo = DefaultsKey<String?>("phoneNo")
    static let islogin = DefaultsKey<Bool?>("islogin")
}

После успешного входа в систему вы можете установить значения вышеуказанных DefaultKeys как DefaultKeys ниже, сначала import SwiftyUserDefaults,

Defaults[.username] = Your_User_Name
Defaults[.phoneno] = Your_Phone_No
Defaults[.islogin] = true

Теперь в вашем первом LoginViewController, в viewDidLoad(), проверьте следующее,

if Defaults[.islogin] == true {
    //Go to Home with animation false
}

Вот, пожалуйста, дайте мне знать в случае любых запросов.

FYI. Это только сценарий, фактический может отличаться в зависимости от вашего окончательного требования. Этот ответ может вам помочь.

Ответ 2

Для Firebase (и это похоже на FireStore). После того, как Пользователь будет аутентифицирован на устройстве, они автоматически будут "войти в систему" в Firebase/Firestore в следующих сеансах, если не существует определенного SignOut (Auth.auth(). SignOut()) или, если нет сверхсрочной задержки (не конечно, как долго, может быть, месяц).

Чтобы проверить, не вошел ли пользователь в систему.

В Start Up (doneFinishLaunchingWithOptions) настроен Auth Listener, и он будет запускаться один раз и возвращать текущий статус Auth.

func addUserListener() {
    listenHandler = Auth.auth().addStateDidChangeListener { (auth, user) in
        if user == nil {
            // We are Logged Out of Firebase.
            // Move to Login Screen
        } else {
            // we are Logged In to Firebase.
            // Move to Main Screen
        }
  }

Вам действительно нужно использовать Auth Listener для вызовов для входа, как если бы у кого-то было два устройства и журналы на одном устройстве, они будут выходить из Firebase, а второе устройство выйдет из строя, когда вы попробуете вызов firebase, потому что он по-прежнему считает, что он зарегистрирован в.

Ответ 3

Обновите свои учетные данные или флаг loggedIn для пользователя. По умолчанию

UserDefaults.standard.set("value", forKey: "username")
UserDefaults.standard.set("value", forKey: "password")

(NB: я рекомендовал не хранить пароль напрямую, вы могли бы хранить токен аутентификации в Userdefaults, и если вы хотите сохранить пароль, используйте вместо этого keychain)

И перенаправить на соответствующую страницу из AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

   var initialViewController: UIViewController?
    let mainStoryboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    if let username = UserDefaults.standard.value(forKey: "username"), let password = UserDefaults.standard.value(forKey: "password") {
        initialViewController = mainStoryboard.instantiateViewController(withIdentifier: "HomeVC")
    } else {
        initialViewController = mainStoryboard.instantiateViewController(withIdentifier: "LoginVC")
    }
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = initialViewController
    self.window?.makeKeyAndVisible()
   return true
}