问题描述
我想自动捕捉或读取短信的一次性密码。我做了一些像这样的代码测试:
import 'package:Flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',theme: ThemeData(
primarySwatch: Colors.blue,),home: MyHomePage(title: 'Demo Auto OTP'),);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key,this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
TextEditingController _textController = TextEditingController();
String _error;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Multi-Factor-Authentication"),body: Form(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,mainAxisSize: MainAxisSize.min,children: [
TextField(
controller: _textController,autofillHints: [ AutofillHints.oneTimeCode ],keyboardType: TextInputType.visiblePassword,maxLength: 6,maxLengthEnforced: true,style: TextStyle(fontSize: 32),RaisedButton(
child: Text("Verify"),onpressed: () => Navigator.of(context).pop(_textController.value.text),],)
);
}
}
这是测试短信:12345 is your code to log in.
oneTimeCode 的 Flutter 文档: https://api.flutter.dev/flutter/services/AutofillHints/oneTimeCode-constant.html
颤动自动填充:https://github.com/flutter/flutter/blob/7891006299/packages/flutter/lib/src/services/autofill.dart#L362
IOS:https://developer.apple.com/documentation/uikit/uitextcontenttype
安卓: https://developer.android.com/reference/androidx/autofill/HintConstants#AUTOFILL_HINT_SMS_OTP
解决方法
您可以使用这个包:https://pub.dev/packages/sms_autofill
但请考虑以下限制:
Android SMS 约束 接收代码需要遵循 此处描述的一些规则: https://developers.google.com/identity/sms-retriever/verify
不超过 140 个字节 以前缀 开始包含一个 客户端发送回您的服务器以完成的一次性代码 验证流程以 11 个字符的哈希字符串结尾 识别您的应用 SMS 的一个示例是:
ExampleApp:您的代码是 123456 FA+9qCX9VSu
,我已使用此 package
接收短信 Check it
它的作用是通过它的监听器监听 SMS,当 SMS 到达时它打印 SMS。
这是Code
,我之前为此写过(我不确定软件包是否进行了一些更改或更新,因为我已经有一段时间没有使用它了,但是那个时候它工作得很好。),
SmsReceiver receiver = new SmsReceiver();
await receiver.onSmsReceived.listen((SmsMessage msg) => checkSMS(msg));
打印SMS
主体的方法,
checkSMS(SmsMessage msg) async {
print(msg.body);
}
现在您可以自动填充 SMS
并使用 OTP
中的一些 regex
提取 msg.body
,并将其设置为 TextFieldController
文本以进行自动填充。
注意:它会获取每条短信,因此要获取唯一一条您需要的短信,您必须检查关键字或在您身边设置一些正则表达式以仅显示 OTP 消息或您的公司名称。