我正在使用云 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/