You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Android端SMS OTP自动填充:无需短信哈希码实现方案求助

React Native Android 无需短信哈希实现OTP自动填充方案

你遇到的autoComplete="sms-otp"不生效问题,本质是Android系统默认的SMS自动填充依赖SMS Retriever API,而这个API要求短信必须包含应用签名哈希才能触发自动填充,所以纯靠TextInput属性肯定行不通。下面给你几个不需要短信哈希的可行方案:

这个API不需要短信里加哈希,核心逻辑是系统帮你监听包含OTP的短信,然后弹出一个用户授权对话框,用户确认后就能拿到短信内容,再提取OTP填充到输入框。

实现步骤:

  • 原生Android端:
    1. 在build.gradle里添加依赖:implementation "com.google.android.gms:play-services-auth-api-phone:18.0.1"
    2. 创建逻辑发起SMS User Consent请求,监听SmsRetriever的回调。当收到符合条件的短信时,系统会弹出授权框,用户同意后即可获取短信内容。
    3. 用正则匹配(比如匹配6位数字)解析短信提取OTP,再通过React Native桥接机制把OTP传递给JS端。
  • React Native端:
    1. 通过NativeEventEmitter监听原生发送的OTP事件。
    2. 拿到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:35:14