如何在 Swift 中为 OTP 倒计时

How to give count down for OTP in Swift

我需要为重发 otp 设置 60 秒倒计时。如果我点击 verifyOtp butn 然后倒计时停止。我希望那个 otp 是 expire。在倒计时重新发送 otpbutton 被禁用.. 请建议我如何设置重新发送倒计时。

我在 registrService() 中获取 otp。

    do{
                var json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
                let regUserStatus = json["status"] as? String

                if regUserStatus == "sucess"
                {
                    print("the json regggggggggggis \(json)")
                    let phNum = json["mobile_number"] as? Int
                    let status = json["status"] as? String
                    self.otpField = json["otp"] as? Int
                }
                else{
                    DispatchQueue.main.async {
                        self.registerButton.isHidden = false
                        self.sendOtpButton.isHidden = true
                        self.otpTextField.isHidden = true
                        self.resendButn.isHidden = true
                        self.otpcountLabel.isHidden = true
                        AlertFun.ShowAlert(title: "", message: "user exist", in: self)
                    }

                }
            }

重新发送按钮。

   @IBAction func resendOtpButn(_ sender: Any) {
    print("resendotp tapped")

    registerService()
   }

启动 OTP 过程后,您需要创建一个 60 秒计时器,当它到期时它会运行一个选择器方法:

创建一个 class 关卡计时器 属性:

var otpTimer: Timer?

点击注册按钮时创建计时器

@IBAction func regButn(_ sender: Any) {
  registerService()
  startTimer()
}

func startTimer() {
  optTimer?.invalidate(). //cancels it if already running
  optTimer = Timer.scheduledTimer(timeInterval: 60, target: self, selector: #selector(timerDidFire(_:)), userInfo: userInfo, repeats: false)
}

当您的计时器归零时,将调用选择器,您可以做任何您想做的事来使 otp 请求过期

@objc func timerDidFire(_ timer: Timer) {

   // timer has completed.  Do whatever you want...
}

如果点击重新发送按钮,我想你想重新启动计时器,所以...

@IBAction func resendOtpButn(_ sender: Any) {
  registerService()
  startTimer()
}

如果你的 otp 成功完成,你可能还想取消计​​时器,所以在你的成功完成处理程序中你可以这样做

self.optTimer?.invalidate()