标签 SMS User Consent API 下的文章

Google官方app都可以到。我想大概率不是单独的权限。后来发现signal登录的时候,获取到短信验证码会自动填充。这样的场景和APP还有很多。以下是如何实现的方案。

Android端

Android有两种方案不申请短信权限获取验证码。

一、SMS Retriever API 机制

  1. 生成特征码: App应用会向 Google Play 服务请求一个属于它自己的唯一样式哈希字符串(通常是 11 个随机字符FAp49keObki)。
  2. 发送带有这个随机字符的短信,随机字符需要放在末尾,例如: > [APP NAME] Your verification code is: 123456. FAp49keObki`
  3. Google Play 服务会扫描这条短信。当系统看到末尾的 FAp49keObki 时,立刻就知道这是你的APP的验证码
  4. 投递给APP,APP处理验证码内容。

在这个过程中,APP 从头到尾都拿不到短信读写权限,它只能通过系统被动接收那一条属于它自己的验证码短信。

二、SMS User Consent API

其实Android预留了“获取短信验证码”的权限。目前广为人知的获取这个权限的APP是QQ。你可以在接收到短信验证码的时候看到这样的权限提示。

“_允许 QQ 读取这条验证码吗?_”

你点击允许后,系统才会把这一条短信的内容共享给 QQ。这同样不需要应用在后台拥有长期的 READ_SMS 权限,属于单次临时授权

iOS的自动填充

iOS似乎获取不到这个权限,但是十年前的iOS版本开始会优化验证码短信,直接显示在键盘顶部提示快捷输入。不过apple的系统APP似乎可以获取到。

WEB页面的自动填充

当你在web端申请获取验证码时,如果你的短信中包含了@根域名 这样的字符,你的短信会被系统识别为验证码短信,同样会触发快捷输入。iOS和Android目前均支持该操作。例如

Your QQ login code is 123456

@qq.com #123456

这样在QQ根域的页面,收到这条短信时,就会触发自动填充操作。