[英]How to save and retrieve values from KeychainWrapper in swift
我已經在 otpButn 中保存了 uid .. 我正在 registerButn 中檢索 uid .. 但我得到了 nil 因為我在 otpButn 之前錄制了 registerBtn .. 所以我怎樣才能全局保存 uid 我的意思是如何將所有注冊人員的 uid 存儲在 keychainWrapper 中並檢索它在regterBtn ..請在下面的代碼中幫助我。
我的 uid 為零。請幫助我如何在 keychainwrapper 中存儲和檢索 uid,以檢查用戶在注冊時是否存在。
這是我的代碼:
import UIKit
class RegistrationViewController: UIViewController, UITextFieldDelegate {
//MARK:- Outlets
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var phoneNumTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var conformPasswordTextField: UITextField!
@IBOutlet weak var otpTextField: UITextField!
@IBOutlet weak var registerButton: UIButton!
@IBOutlet weak var sendOtpButton: UIButton!
var otpField: Int?
var Uid: Int?
override func viewDidLoad() {
super.viewDidLoad()
self.phoneNumTextField.keyboardType = .phonePad
otpTextField.isHidden = true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
//MARK:- ButtonActions
@IBAction func registerButton(_ sender: Any) {
if (nameTextField.text == "" || phoneNumTextField.text == "" || passwordTextField.text == "" || conformPasswordTextField.text == "")
{
registerButton.isHidden = false
sendOtpButton.isHidden = true
AlertFun.ShowAlert(title: "Title", message: "RequiredAllFields", in: self)
}
else{
registerButton.isHidden = true
sendOtpButton.isHidden = false
otpTextField.isHidden = false
DispatchQueue.main.async {
self.otpTextField.text = self.otpField as? String
}
registerService()
}
}
@IBAction func sendOTPButton(_ sender: Any) {
otpService()
}
//MARK:- Service part
@objc func registerService(){
print("register tapped")
let parameters = ["mobile_number": Int(phoneNumTextField.text ?? "") as Any,
"password":passwordTextField.text as Any,
"name": nameTextField.text as Any]
let url = URL(string: "https://dev.anyemi.com/webservices/anyemi/register")
var req = URLRequest(url: url!)
req.httpMethod = "POST"
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) else {return}
req.httpBody = httpBody
let session = URLSession.shared
session.dataTask(with: req, completionHandler: {(data, response, error) in
if response != nil {
// print(response)
}
if let data = data {
do{
let userId: Int? = KeychainWrapper.standard.integer(forKey: "Uid")
print("the keychain uid \(userId)")
if userId != nil{
AlertFun.ShowAlert(title: "Title", message: "already exists", in: self)
}
else{
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
print("the json regggggggggggis \(json)")
self.otpField = json["otp"] as? Int
}
}catch{
print("error")
}
}
}).resume()
}
@objc func otpService(){
let parameters = ["mobile_number": phoneNumTextField.text as Any,
"otp": otpTextField.text as Any]
let url = URL(string: "https://dev.anyemi.com/webservices/anyemi/otpverify")
var req = URLRequest(url: url!)
req.httpMethod = "POST"
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) else {return}
req.httpBody = httpBody
let session = URLSession.shared
session.dataTask(with: req, completionHandler: {(data, response, error) in
if response != nil {
// print(response)
}
if let data = data {
do{
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
print("the json of otppppppppp \(json)")
DispatchQueue.main.async {
if (self.otpTextField.text == String(self.otpField ?? 1)){
print("registration successfullllll...")
let mobileNum = json["mobile_number"] as! [String : Any]
self.Uid = mobileNum["id"] as? Int
print("otp Uid \(String(describing: self.Uid))")
DispatchQueue.main.async {
KeychainWrapper.standard.set(self.Uid!, forKey: "Uid")
}
let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.present(loginVC, animated: true)
}
else {
print("register fail")
}
}
}catch{
print("error")
}
}
}).resume()
}
}
您可以參考以下鏈接以從 KeyChainWrapper 中保存和檢索值
https://github.com/jrendel/SwiftKeychainWrapper
在 Integrate 之后,您只需要創建一個帶有完成處理程序的 function :
func isUserExist(handleComplete:@escaping ((Bool)->())) {
let userId: String? = KeychainWrapper.standard.string(forKey: "Uid")
DispatchQueue.main.async {
if userId != nil{
AlertFun.ShowAlert(title: "Title", message: "This user is Already exist", in: self)
handleComplete(false)
}else{
handleComplete(true)
}
}
}
並調用此 function 來檢查 Uid 的驗證,如下所示:
self.isUserExist { isExxist in
if isExxist {
self.registerService()
self.otpTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
}else{
//here you can do whatever you want
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.