有没有什么方法可以访问从 iPhone 收件箱(SMS)到 ios 应用程序的数据,以像 Android 中的那样进行自动 OTP 验证?我会感谢你的帮助。
13 回答
在 iOS 12 中,Apple 引入了名为Security Code AutoFill
.
要在您的应用程序中使用它,您需要做的就是设置UITextField
输入视图的textContentType
属性oneTimeCode
。
otpTextField.textContentType = .oneTimeCode
注意:安全代码自动填充仅适用于系统键盘,不适用于自定义键盘。
当您获得 OTP 时,它将如下所示:
同样重要的是,您收到的短信包含带有“代码”之类的内容
“您的密码是:123456”
或者
“12345 是您的登录代码”
沿着这条线的东西。
不是!
您的应用程序:12345
您可以通过点击消息中带下划线的代码来验证短信中的代码是否适用于 .oneTimeCode 类型。如果弹出一个显示“复制代码”的对话框,您就可以开始了。否则,您可能需要更改消息的文本。
更新
从 iOS 12 开始,Apple 将在UITextField、UITextView 和任何采用 UITextInput 协议的自定义视图上支持密码自动填充。系统键盘将其上的 textContentType 设置为.oneTimeCode
1) 使用代码
singleFactorCodeTextField.textContentType = .oneTimeCode
2) 使用情节提要/XIB
选择
UITextField
/单击单击属性检查器UITextView
。storyboard/XIB
转到文本输入特征,单击内容类型并选择一个时间码并完成。
操作系统将使用此UITextContentType
设置自动检测来自 Messages 的验证码。
警告
如果您对安全代码输入文本字段使用自定义输入视图,iOS 将无法显示必要的自动填充 UI。
更多信息可以在苹果开发者oneTimeCode上查看
并查看WWDC 2018 Session 204 - Automatic Strong Passwords and Security Code AutoFill并跳转到24:28自动预填充 OTP。
目前对于 iOS 12 及更高版本,您可以使用安全码自动填充
oneTimeCodeTextField.textContentType =.oneTimeCode
然而,ApplePay 自 iOS 11 以来一直在进行自动验证,但开发人员尚无法使用。
另外...在手机上需要打开“自动填充密码”。
在 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();
注意:安全代码自动填充仅适用于系统键盘(非自定义)。
我从santosh kumar和Ted的回答中得到了解决方案
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
方法,请评论它。否则此代码将不起作用
要在您的文本字段上获取 otp,需要注意两件事
1.将您的输入文件设置为otp
其他答案让您知道如何管理您的代码以接收 otp。
2.在您的消息中提供“代码”短语
您的消息必须包含英文的“code”、“passcode”、“password”,如果您想在其他语言测试中启用它,请将某些单词从“code”翻译成您的语言
我收到了以下信息:
西班牙语:(编码)
德国:(科德)
捷克语:(科德)
波斯语: (رمز)
阿拉伯语: (رمز)
otp 编号必须是英文而不是您的语言编号,您的“代码”短语必须与您的数字隔开一个空格或与“:”不带空格。
代码 1111111
代码:111111
您必须注意的另一件重要事情是关于消息预览。如果下面有一条灰线,这些数字将被检测为 otp。如果它显示为蓝色或没有线条,则消息不会以 otp 形式通知您。有点像图片
您可以从您的消息中获取 OTP。
otptextField.textContentType = .oneTimeCode
请从他的链接中获取项目。
支持自动填充 OTP 注意:要从消息中读取 OTP,消息应包含代码或密码
if #available(iOS 12.0, *) {
optTextField.textContentType = .oneTimeCode
} else {
// Fallback on earlier versions
print("Fallback on earlier versions")
}
if(server.google==server.connected)}{
return server;
}
连接时制作一个 lambda ( e-> "")
;!!
不。
由于这将被视为隐私问题,因此您无法访问用户的 SMS 收件箱。