首页 > 解决方案 > 如何给一些时间(60 秒)快速重新发送 OTP 按钮

问题描述

我有带有 OTP 验证的注册屏幕。一旦我点击 regstrButton,然后 OTP 将被发送到注册的手机号码。当时重新发送 otp 按钮将在 60 秒后显示时间 60 秒,如果我点击重新发送 otp 按钮,那么我需要重新发送 otp到注册号码.. 如下图

在此处输入图像描述

重新发送按钮需要显示 60 秒后我需要重新发送 otp 如何?

在此处输入图像描述

我的 otp 服务代码:

import UIKit
class RegistrationViewController: UIViewController, UITextFieldDelegate 
 {
//MARK:- Outlets
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var phoneNumTextField: UITextField!
@IBOutlet weak var emailTextField: 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!
@IBOutlet weak var otpcountLabel: UILabel!
@IBOutlet weak var resendButn: UIButton!

var otpField: Int?
var otpTimer = Timer()
var totalTime = 10

override func viewDidLoad() {
    super.viewDidLoad()
    self.phoneNumTextField.keyboardType = .phonePad
    otpTextField.isHidden = true
    resendButn.isHidden = true
}
  @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
        resendButn.isHidden = false
        DispatchQueue.main.async {
            self.otpTextField.text = self.otpField as? String
        }
        registerService()
        otpTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update), userInfo: nil, repeats: true)
    }
}

@IBAction func sendOTPButton(_ sender: Any) {
    otpService()
}
@IBAction func resendOtpButn(_ sender: Any) {
    print("resendotp tapped")
    otpTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update), userInfo: nil, repeats: true)
    registerService()
}
@objc func update() {
    if(totalTime > 0) {
        totalTime = totalTime - 1
        print(totalTime)
        otpcountLabel.text = String(totalTime)
        //resendButn.setTitle("\(totalTime) Resend Otp", for: .normal)
    }
    else {
        //otpcountLabel.isHidden = true
        otpTimer.invalidate()
        print("call your api")
        //registerService()
    }
}

//MARK:- Service part
@objc func registerService(){

    print("register tapped")

    let parameters = ["mobile_number": Int(phoneNumTextField.text ?? "") as Any,
                      "email":emailTextField.text as Any,
                      "password":passwordTextField.text as Any,
                      "name": nameTextField.text as Any]

    let url = URL(string: "https://dev.com/webservices/register")
    var req =  URLRequest(url: url!)
    req.httpMethod = "POST"
    req.addValue("application/json", forHTTPHeaderField: "Contet-Type")
    req.addValue("application/json", forHTTPHeaderField: "Accept")

    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 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.com/webservices//otpverify")
    var req =  URLRequest(url: url!)
    req.httpMethod = "POST"
    req.addValue("application/json", forHTTPHeaderField: "Contet-Type")
    req.addValue("application/json", forHTTPHeaderField: "Accept")

    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!)){
                        print("registration successfullllll...")
                        let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
                        self.present(loginVC, animated: true)
                    }
                    else if self.otpTextField.text == ""{
                        AlertFun.ShowAlert(title: "", message: "Please enter OTP", in: self)
                        print("register fail")
                    }
                    else {
                        AlertFun.ShowAlert(title: "", message: "Invalid OTP", in: self)
                        print("register fail")
                    }
                }
            }catch{
                print("error")
            }
        }
    }).resume()
}
}

请在代码中帮助我。

标签: jsonswifttimeuibuttonone-time-password

解决方案


var count = 60  // 60sec if you want
var resendTimer = Timer()

在您的提交按钮上

@IBAction func sendOTPButton(_ sender: Any) {
     resendTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update), userInfo: nil, repeats: true)
 }

然后定时器功能

@objc func update() {
    if(count > 0) {
        count = count - 1
        print(count)
        btn.setTitle("\(count) Resend Otp", for: .normal)
    }
    else {
        resendTimer.invalidate()
        print("call your api")
        // if you want to reset the time make count = 60 and resendTime.fire()
    }
}

推荐阅读