iOS中自动OTP验证?

57

有没有办法从iPhone收件箱(短信)中访问数据,以便像Android中那样进行自动OTP验证的iOS应用程序?感谢您的帮助。


不要这样想,你必须要让他们手动输入。 - Tj3n
12个回答

47

iOS 12中,苹果公司引入了名为“安全码自动填充”的功能。

要在您的应用程序中使用此功能,您所需做的就是设置UITextField输入视图的textContentType属性为oneTimeCode即可。

otpTextField.textContentType = .oneTimeCode

注意:安全代码自动填充只能与系统键盘一起使用,无法与自定义键盘一起使用。

WWDC 视频

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

enter image description here


是的,iPhone 7 在登录时没有要求我保存密码或自动填充。我猜它需要在使用前将某个帐户保存在钥匙串中。 - Waqas
@Waqas 它不会要求您保存密码。当您收到OTP时,您将在键盘上方看到一个带有OPT代码的工具栏。 - iVarun
1
你说得对,那个点已经被理解并且非常清晰。我在问的是自动填充功能。在苹果WWDC会议上的https://developer.apple.com/videos/play/wwdc2018/204/中也提到了自动填充密码。 - Waqas
在消息内容中识别一次性代码是否有特定的格式? - Dhaval H. Nena
抱歉,我想问一下这个.onetimecode是否也可以与WhatsApp OTP一起使用?还是只能与短信OTP一起使用? - afi permana
显示剩余4条评论

16
重要的是,您收到的短信中必须包含“代码”之类的内容,例如:

“您的密码是:123456”

或者

“12345是您登录的代码”

类似这样的内容。 不要出现以下情况!

Your App: 12345

您可以通过点击短信中下划线标记的代码来验证该代码是否适用于.oneTimeCode类型。如果弹出对话框显示“复制代码”,则表示您可以继续使用。否则,您可能需要更改短信的文本内容。

12

更新

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

1)使用代码

singleFactorCodeTextField.textContentType = .oneTimeCode

2)使用 Storyboard/XIB

storyboard/XIB 中,选择 UITextField/UITextView 并点击属性检查器。进入文本输入特性,点击内容类型并选择一次性代码即可完成设置。

操作系统会根据设置的 UITextContentType 自动检测来自短信的验证码。

注意

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

WWDC 2018 iPhoneX 设备

有关更多信息,请参阅 Apple Developer 网站上的 oneTimeCode .

另外还需查看WWDC 2018 Session 204,跳转至24:28以实现自动填充OTP功能。


我遇到了这个问题 https://dev59.com/gbroa4cB1Zd3GeqPoqlf - Gaurav Borole
1
如果我没有点击“来自消息180605”怎么办?我想在用户未点击的情况下填写文本字段。 - Nirav Kotecha
@iNiravKotecha 我认为这是不可能的,因为你没有点击,怎么能获取OTP数据呢? - Ramkrishna Sharma
@RamkrishnaSharma 我想要像安卓一样,短信来了就自动填充到文本框里。 - Nirav Kotecha

12

目前针对iOS 12及以上版本,您可以使用安全代码自动填充

oneTimeCodeTextField.textContentType =.oneTimeCode

然而,自 iOS 11 以来,ApplePay 已经开始进行自动验证,但这项功能对开发者尚不可用。


1
有没有特定的方法可以使其与网站 OTP 兼容,还是它默认就可以工作? - Amien
你能给我关于iOS 11的指南吗? - Himanshu Moradiya
它目前在安卓上不是自动的,但这是你能做的最好的。 codeTextField.textContentType = .oneTimeCode - Ted
这似乎会自动将OTP输入到输入字段中,而其他示例只是在键盘上方显示建议。这两者之间的实现有什么区别吗? - Umang Galaiya
这个应该是使用私有API由Apple Pay完成的。据我所知,尚未对公众开放。 - Ted
显示剩余3条评论

10

此外,在手机上,“自动填充密码”需要打开。


2
唉,这是我唯一看到提到这个问题的地方。我一直在调试并想知道为什么代码不起作用... - JOM
1
我了解你的痛苦...因此发布这篇文章。 - AntDC
@AntDC 我正在使用iOS 13.4.1,键盘没有自动填充建议显示,请你能帮忙吗? - Arshad Shaik

8

要在文本字段上获取otp,需要注意以下两点:

1. 将您的输入字段设置为otp

其他答案会告诉您如何管理代码以接收otp。

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

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

我收到了以下单词的消息:

西班牙语:(Codingo)

德语:(Kode)

捷克语:(Kod)

波斯语:(رمز)

阿拉伯语:(رمز)

otp数字必须是英语而不是您的语言数字,“Code”短语必须与您的数字分开,只有一个空格或使用“:”没有空格。

Code 1111111

Code:111111

另一个重要的事情是关于消息预览。如果数字下面有灰线,则数字将被检测为otp。如果它显示为蓝色或没有线,则消息不会通知您作为otp。像图片一样的东西。

enter image description here


8
在 Xamarin iOS 中,适用于 >=iOS 12:
首先,短信需要在其消息中包含关键字"code" 或 "passcode",并且不要在代码后使用空格。如果您收到了短信并且有"复制代码"按钮,则可以正常工作。

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

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


6

我从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

  • TextFieldAction
   //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方法,请加上注释。否则,此代码将无法正常工作。


我遇到了这个问题 https://dev59.com/gbroa4cB1Zd3GeqPoqlf - Gaurav Borole
如果你遇到这个问题,请将textContentType仅设置为.oneTimeCode,适用于OTP文本框。 - steveSarsawa
@DilipTiwari 你遇到了什么问题? - steveSarsawa
1
嗨@steveSarsawa,按照您建议的更改消息内容后,问题得到了解决,非常感谢您。我忘记感谢您了。 - Dilip Tiwari
@DilipTiwari 你可以通过给我的回答点赞来感谢我 ;) - steveSarsawa
显示剩余3条评论

4

您可以在Storyboard中轻松设置此选项。

点击属性检查器。转到文本输入特性,单击内容类型并选择一次代码


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接