首页 > 解决方案 > 如何快速将 OTP 发送到注册的手机号码?

问题描述

在我的应用程序中,注册时我需要将 otp 发送到注册号码,但我无法将 otp 发送到注册号码。对于注册,我有两个 api,一个是注册和 otpverify...当我单击 registerButton 时,我需要将 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!

var otpField: Int?

//MARK:- lifecycle methods

override func viewDidLoad() {
    super.viewDidLoad()
    self.phoneNumTextField.keyboardType = .phonePad

    otpTextField.isHidden = true
}
//MARK:- ButtonActions

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

@IBAction func sendOTPButton(_ sender: Any) {

    otpService()
}

//MARK:- Service part
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://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]
                let phNum = json["mobile_number"] as? Int
                self.otpField = json["otp"] as? Int
                DispatchQueue.main.async {
                    self.otpTextField.text = self.otpField as? String
                }
            }catch{
                print("error")
            }
        }
    }).resume()
}

func otpService(){

    let parameters = ["mobile_number": phoneNumTextField.text as Any,
                      "otp": otpTextField.text as Any]

    let url = URL(string: "https://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]
                let mobileNum = json["mobile_number"] as! [String : Any]

                let Uid = mobileNum["id"] as? String
                let name = mobileNum["name"] as? String
                let phNum = mobileNum["username"] as? String

                DispatchQueue.main.async {
                    if (self.otpTextField.text == String(self.otpField!)){
                        print("registration successfullllll...")

                        let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
                        self.present(loginVC, animated: true)
                    }
                    else{
                        print("register fail")
                    }
                }
            }catch{
                print("error")
            }
        }
    }).resume()
}
}

这里如何发送otp到注册的手机号码。请在这里帮助我。

标签: jsonswiftiphonesendmessageone-time-password

解决方案


您应该注意一件事:

  • 你重复了你的代码:调用网络服务。你应该有一个负责这个的类,你只需传递方法(post,get ...)和参数。

关于将 OTP 发送到注册的电话号码,这应该是您的后端的责任。

而且,这不是 otpTextField 的值,就像这段代码

let parameters = ["mobile_number": phoneNumTextField.text as Any, "otp": otpTextField.text as Any]

有一些第三方可以帮助进行电话验证(当然包括发送 otp),例如 Facebook 的 AccountKit(但不幸的是,它自 2019 年 9 月起停止)或 Twilio(目前似乎是最佳选择)。

您可以按照此将 Twilio 电话验证集成到您的应用程序中: https ://www.twilio.com/blog/phone-verification-in-ios-with-twilio-verify-and-swift-html


推荐阅读