React Native Android端SMS OTP自动填充:无需短信哈希码实现方案求助
React Native Android 无需短信哈希实现OTP自动填充方案
你遇到的autoComplete="sms-otp"不生效问题,本质是Android系统默认的SMS自动填充依赖SMS Retriever API,而这个API要求短信必须包含应用签名哈希才能触发自动填充,所以纯靠TextInput属性肯定行不通。下面给你几个不需要短信哈希的可行方案:
方案1:使用Android SMS User Consent API(推荐)
这个API不需要短信里加哈希,核心逻辑是系统帮你监听包含OTP的短信,然后弹出一个用户授权对话框,用户确认后就能拿到短信内容,再提取OTP填充到输入框。
实现步骤:
- 原生Android端:
- 在
build.gradle里添加依赖:implementation "com.google.android.gms:play-services-auth-api-phone:18.0.1" - 创建逻辑发起SMS User Consent请求,监听
SmsRetriever的回调。当收到符合条件的短信时,系统会弹出授权框,用户同意后即可获取短信内容。 - 用正则匹配(比如匹配6位数字)解析短信提取OTP,再通过React Native桥接机制把OTP传递给JS端。
- 在
- React Native端:
- 通过
NativeEventEmitter监听原生发送的OTP事件。 - 拿到OTP后直接设置到TextInput的state里完成自动填充。
- 通过
这个方案不需要敏感权限,也不用修改短信模板,是目前最合规的无哈希OTP填充方案。
方案2:监听系统短信广播(需敏感权限)
如果你的应用能申请到短信权限,可以通过注册广播接收器监听短信接收事件,直接读取短信内容提取OTP,但注意Android 10及以上版本,READ_SMS属于敏感权限,需要用户手动授权,且应用商店可能会限制这类权限的使用,需谨慎选择。
实现要点:
- 在
AndroidManifest.xml里声明权限:<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> - 动态申请权限后,注册广播接收器监听
android.provider.Telephony.SMS_RECEIVED广播。 - 收到短信后解析内容,提取OTP并传递给RN端。
方案3:补全TextInput配置(尝试性方案)
有时候autoComplete="sms-otp"不生效是因为缺少配套配置,你可以试试补全这些属性,虽然没有哈希还是大概率不行,但可以排查是否是配置问题:
<TextInput placeholder="请输入6位验证码" accessibilityLabel="OTP输入框" autoComplete="sms-otp" keyboardType="number-pad" autoCapitalize="none" autoCorrect={false} textContentType="oneTimeCode" // 兼容iOS的OTP自动填充 maxLength={6} />
总的来说,优先选SMS User Consent API方案,体验和合规性都最好,不需要改短信模板就能实现OTP自动填充。
内容的提问来源于stack exchange,提问作者TheDeveloper
相关产品推荐
相关产品推荐

