iOS中的自动OTP验证?

时间:2016-09-22 05:49:34

标签: ios iphone sms one-time-password ios12

有没有办法从iPhone收件箱(SMS)访问数据到ios应用程序进行自动OTP验证,就像在Android中一样?我将非常感谢你的帮助。

13 个答案:

答案 0 :(得分:15)

在iOS 12中,Apple推出了名为Security Code AutoFill的功能。

要在您的应用中使用此功能,您需要设置UITextField的输入视图的textContentType属性oneTimeCode

otpTextField.textContentType = .oneTimeCode

注意:安全码自动填充功能仅适用于系统键盘,不适用于自定义键盘。

WWDC video

当你得到OTP时,它看起来像这样:

enter image description here

答案 1 :(得分:6)

UPDATE

从iOS 12开始,Apple将在 UITextField,UITextView和任何采用UITextInput协议的自定义视图上支持密码自动填充。系统键盘将其上的textContentType设置为 .oneTimeCode

1)使用代码

singleFactorCodeTextField.textContentType = .oneTimeCode

2)使用情节提要/ XIB

  

UITextField中选择UITextView / storyboard/XIB,然后单击“单击属性”。   检查员。转到文本输入特征,单击“内容类型”并选择   一次完成代码。

设置了UITextContentType后,操作系统将自动从消息中检测验证码。

  

警告

     

如果您将自定义输入视图用于安全代码输入文本字段,   iOS无法显示必要的自动填充UI。

WWDC 2018 iPhoneX Device

有关更多信息,可以在Apple开发人员oneTimeCode

上进行检查。

还要查看WWDC 2018 Session 204 - Automatic Strong Passwords and Security Code AutoFill并跳转到 24:28 以自动预填充OTP。

答案 2 :(得分:5)

<强>更新

现在可以在带有Security Code Autofill

的iOS 12中使用 自iOS 11以来,Apple正在苹果支付卡验证中使用它

enter image description here

答案 3 :(得分:4)

在Xamarin iOS中,对于> = iOS 12:

首先,SMS的消息中必须包含关键字“代码”或“密码” ,并且不要在代码后使用空格。如果您收到短信,并且有“复制代码” 按钮,那么它将起作用

enter image description here

然后您需要放置此:

_txtField = new UITextField()
{
   UserInteractionEnabled = true,
};
if (UIDevice.CurrentDevice.CheckSystemVersion(12, 0))
{
  _txtField.TextContentType = UITextContentType.OneTimeCode;          
}
_txtFieldDelegate = new UITextFieldDelegate();
_txtField.Delegate = _txtFieldDelegate;
_txtField.BecomeFirstResponder();

注意:安全代码自动填充仅适用于系统键盘(不适用于自定义)。

答案 4 :(得分:3)

同样重要的是,您收到的短信中包含带有“代码”的内容,例如

  

“您的密码是:123456”

  

“ 12345是您要登录的代码”

沿着那条线。

不!

  

您的应用:12345

您可以通过点按消息中带下划线的代码来验证文本消息中的代码是否适用于.oneTimeCode类型。如果弹出一个对话框,提示“复制代码”,那就很好了。否则,您可能需要更改消息的文本。

答案 5 :(得分:2)

您可以在情节提要中轻松设置它

Click on Attribute inspector. Go to text input trait, click on Content type and select one time code

答案 6 :(得分:1)

还...在电话上,需要打开“自动填充密码”。

答案 7 :(得分:1)

我从santosh kumarTed的答案中得到了解决。

var otpText = String()
  • viewDidload()
     if #available(iOS 12.0, *) {
         txtFirst.textContentType = .oneTimeCode
         txtSecond.textContentType = .oneTimeCode
         txtThird.textContentType = .oneTimeCode
         txtForth.textContentType = .oneTimeCode
         txtFifth.textContentType = .oneTimeCode
     }

     txtFirst.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: .editingChanged)
     txtSecond.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: .editingChanged)
     txtThird.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: .editingChanged)
     txtForth.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: .editingChanged)
     txtFifth.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: .editingChanged)
     txtFirst.becomeFirstResponder() //by doing this it will open the keyboard on first text field automatically

    针对TextField
  • 操作
   //When changed value in textField
    @objc func textFieldDidChange(textField: UITextField){
        let text = textField.text
        if  text?.count == 1 {
            switch textField{

            case txtFirst:
                txtSecond.becomeFirstResponder()
            case txtSecond:
                txtThird.becomeFirstResponder()
            case txtThird:
                txtForth.becomeFirstResponder()
            case txtForth:
                txtFifth.becomeFirstResponder()
            case txtFifth:
                txtFifth.resignFirstResponder()
                self.dismissKeyboard()
            default:
                break
            }
        }
        if  text?.count == 0 {
            switch textField{
            case txtFirst:
                txtFirst.becomeFirstResponder()
            case txtSecond:
                txtFirst.becomeFirstResponder()
            case txtThird:
                txtSecond.becomeFirstResponder()
            case txtForth:
                txtThird.becomeFirstResponder()
            case txtFifth:
                txtForth.becomeFirstResponder()
            default:
                break
            }
        }
        else{

        }
    }
  • OTP字符串和关闭键盘
 func dismissKeyboard(){

        self.otpText = "\(self.txtFirst.text ?? "")\(self.txtSecond.text ?? "")\(self.txtThird.text ?? "")\(self.txtForth.text ?? "")\(self.txtFifth.text ?? "")"

        print(self.otpText)
        self.view.endEditing(true)

    }

最重要的事情:如果您使用的是shouldChangeCharactersIn方法,请对其进行评论。否则此代码将不起作用

答案 8 :(得分:0)

您可以从邮件中获取OTP。

otptextField.textContentType = .oneTimeCode

可以从他的链接中获取项目。

https://github.com/karthickkck315/Automatic-OTP

答案 9 :(得分:0)

支持自动填充OTP 注意:要从消息中读取OTP,消息应包含代码或密码

if #available(iOS 12.0, *) {
            optTextField.textContentType = .oneTimeCode
        } else {
            // Fallback on earlier versions
            print("Fallback on earlier versions")
        }

答案 10 :(得分:0)

要在文本字段中获取 otp,需要注意两件事

1.将您的输入设置为 otp

其他答案让您知道如何管理您的代码以接收 otp。

2.在您的消息中提供“代码”短语

您的消息必须包含英文的“code”、“passcode”、“password”,如果您想在其他语言测试中启用它,将一些词从“code”翻译成您的语言

我收到了带有以下内容的消息:

西班牙语:(编码)

德国:(科德)

捷克语:(Kod)

波斯语:(رمز)

阿拉伯语:(رمز)

otp 号码必须是英文而不是您的语言号码,您的“代码”短语必须与您的号码分开,只有一个空格或没有空格的“:”。

代码 1111111

代码:111111

您必须注意的另一件重要事情是消息预览。如果下面有一条灰线,这些数字将被检测为 otp。如果它显示为蓝色或没有线,则消息不会通知您为 otp。有点像图片

enter image description here

答案 11 :(得分:-3)

没有

由于这会被视为隐私问题,因此您无法访问用户的短信收件箱。

答案 12 :(得分:-3)

if(server.google==server.connected)}{
   return server;
}

在连接时创建一个lambda ( e-> ""); !!