ios - 如何在 iOS swift 中自动登录用户?

标签 ios swift firebase google-cloud-firestore

我正在使用云 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 代码,登录成功。由于用户第一次登录,用户需要填写用户详情页面,然后进入首页。如果它已经登录用户,登录成功后用户将重定向到主屏幕而不是用户详细信息页面。

我的问题是现在用户每次都登录以进入应用程序,我希望用户每次都自动登录而不登录,除非用户注销。如何在 cloud firestore 中检查已登录的用户 UID 或手机是否存在用户或新用户。

非常感谢任何帮助...

最佳答案

让我给你一个简短的场景。

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() 方法中,请检查以下内容,

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

给你,如有任何疑问,请告诉我。

仅供引用。这只是场景,实际可能会有所不同,具体取决于您的最终要求。此答案可能对您有所帮助。

关于ios - 如何在 iOS swift 中自动登录用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50636098/

相关文章:

ios - 如何获取用户的时区?

swift - SMP SDK for iOS 用于 Swift 开发

ios - 为什么要创建一个空数据库(0 口)?

android - 如何按升序或降序排列firebase数据库数据?

ios - 如何使用 Polidea 的 iOS Class Guard 混淆代码?

ios - 无法在导入另一个框架的 Xcode 项目中运行测试

ios - Firebase 是否始终保证按顺序添加事件?

swift - 在 Swift 3 (Xcode 8.3) 上替代 AnyForwardCollection

Firebase 通过 ID 获取用户

reactjs - 结合 React 路由器和 Firebase 函数 api