Как автоматически войти в систему в 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
}