简体   繁体   English

如何从 swift 中的 KeychainWrapper 保存和检索值

[英]How to save and retrieve values from KeychainWrapper in swift

I have saved uid in otpButn.. i am retrieving uid in registerButn.. but i am getting nil because i am taping registerBtn before otpButn.. so how can i save globally uid i mean how to store all registered persons uid in keychainWrapper and retrieve it in regterBtn.. please help me in below code.我已经在 otpButn 中保存了 uid .. 我正在 registerButn 中检索 uid .. 但我得到了 nil 因为我在 otpButn 之前录制了 registerBtn .. 所以我怎样才能全局保存 uid 我的意思是如何将所有注册人员的 uid 存储在 keychainWrapper 中并检索它在regterBtn ..请在下面的代码中帮助我。

I am getting nil in uid.. please help me how to store and retrive uid in keychainwrapper to check if the user is exist or not while registration.我的 uid 为零。请帮助我如何在 keychainwrapper 中存储和检索 uid,以检查用户在注册时是否存在。

here is my code:这是我的代码:

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

You can refer below link for save and retrieve values from KeyChainWrapper您可以参考以下链接以从 KeyChainWrapper 中保存和检索值

https://github.com/jrendel/SwiftKeychainWrapper https://github.com/jrendel/SwiftKeychainWrapper

And After Integrate this you just need to create one function with completion handler:在 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)
            }
        }

    }

and call this function where you want to check validate for Uid like this:并调用此 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM