Как автоматически авторизоваться в iOS swift? - PullRequest
0 голосов
/ 01 июня 2018

Я использую аутентификацию телефона с помощью облачного пожарного депо.В 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 или телефон в облачном пожарном хранилище для пользователя, существующего или нового пользователя.

Любая помощь, высоко ценится pls ...

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Обновите свои учетные данные для входа ИЛИ войдите в систему как флаг пользователя по умолчанию

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

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

и перенаправить на соответствующую страницу из 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
}
0 голосов
/ 08 июня 2018

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

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

При запуске (didFinishLaunchingWithOptions) установите прослушиватель проверки подлинности, и он будет запускаться один раз ивернуть текущий статус аутентификации.

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
        }
  }

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

0 голосов
/ 01 июня 2018

Позвольте мне дать вам краткий сценарий.

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...