49

有没有什么方法可以访问从 iPhone 收件箱(SMS)到 ios 应用程序的数据,以像 Android 中的那样进行自动 OTP 验证?我会感谢你的帮助。

4

13 回答 13

42

在 iOS 12 中,Apple 引入了名为Security Code AutoFill.

要在您的应用程序中使用它,您需要做的就是设置UITextField输入视图的textContentType属性oneTimeCode

otpTextField.textContentType = .oneTimeCode

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

WWDC 视频

当您获得 OTP 时,它将如下所示:

在此处输入图像描述

于 2018-06-11T06:27:26.690 回答
12

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

“您的密码是:123456”

或者

“12345 是您的登录代码”

沿着这条线的东西。

不是!

您的应用程序:12345

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

于 2019-07-29T14:22:59.483 回答
10

更新

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

1) 使用代码

singleFactorCodeTextField.textContentType = .oneTimeCode

2) 使用情节提要/XIB

选择UITextField/单击单击属性检查器UITextViewstoryboard/XIB转到文本输入特征,单击内容类型并选择一个时间码并完成。

操作系统将使用此UITextContentType设置自动检测来自 Messages 的验证码。

警告

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

WWDC 2018 iPhoneX 设备

更多信息可以在苹果开发者oneTimeCode上查看

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

于 2018-09-24T04:17:03.170 回答
9

目前对于 iOS 12 及更高版本,您可以使用安全码自动填充

oneTimeCodeTextField.textContentType =.oneTimeCode

然而,ApplePay 自 iOS 11 以来一直在进行自动验证,但开发人员尚无法使用。

于 2017-11-09T06:55:01.953 回答
8

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

于 2019-10-21T15:41:47.120 回答
8

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

首先,短信需要在短信中加入关键字“code”或“passcode”,并且不要在code后面使用空格。如果您收到短信并且您有“复制代码”按钮,那么它将起作用

在此处输入图像描述

然后你需要放置这个:

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

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

于 2018-11-13T09:36:44.737 回答
5

我从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方法,请评论它。否则此代码将不起作用

于 2020-02-24T12:00:53.380 回答
4

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

1.将您的输入文件设置为otp

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

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

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

我收到了以下信息:

西班牙语:(编码)

德国:(科德)

捷克语:(科德)

波斯语: (رمز)

阿拉伯语: (رمز)

otp 编号必须是英文而不是您的语言编号,您的“代码”短语必须与您的数字隔开一个空格或与“:”不带空格。

代码 1111111

代码:111111

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

在此处输入图像描述

于 2021-06-07T10:04:56.623 回答
4

您可以在 Storyboard 中轻松设置

单击属性检查器。 转到文本输入特征,单击内容类型并选择一个时间码

于 2018-12-04T11:56:24.917 回答
2

您可以从您的消息中获取 OTP。

otptextField.textContentType = .oneTimeCode

请从他的链接中获取项目。

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

于 2018-12-27T10:32:43.310 回答
0

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

if #available(iOS 12.0, *) {
            optTextField.textContentType = .oneTimeCode
        } else {
            // Fallback on earlier versions
            print("Fallback on earlier versions")
        }
于 2020-11-06T05:25:46.407 回答
-10
if(server.google==server.connected)}{
   return server;
}

连接时制作一个 lambda ( e-> "");!!

于 2019-08-09T09:01:46.247 回答
-10

不。

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

于 2017-08-02T09:57:46.200 回答