Ir para o conteúdo
OmniChannels.ai

Autopreenchimento de OTP por SMS: Android, iOS e Web

Como funciona o autopreenchimento de OTP no Android, iOS e web: hash do SMS Retriever, códigos vinculados ao domínio, WebOTP, formato único e WhatsApp.

Atualizado em 9 min de leitura

Por OmniChannels.ai Editorial Team · Revisado por BroadNet Messaging Solutions Team

Integração

Resposta curta

O autopreenchimento de OTP combina três mecanismos distintos. Apps Android usam a SMS Retriever API, que exige um hash do app de 11 caracteres em uma mensagem de até 140 bytes, ou a SMS User Consent API, que dispensa o hash. O iOS sugere códigos a partir do próprio SMS, e códigos vinculados ao domínio terminam com uma linha como @example.com #123456. Sites usam autocomplete="one-time-code" e a WebOTP API, que leem essa mesma última linha.

Nesta página
  1. Como funciona o autopreenchimento de OTP em cada plataforma?
  2. Como funciona a SMS Retriever API do Android?
  3. Como o iOS e o iPadOS preenchem um código automaticamente?
  4. Como funciona o autopreenchimento de OTP na web?
  5. Um único SMS funciona no Android, no iOS e na web?
  6. E com texto em árabe e Unicode?
  7. Como os templates de autenticação do WhatsApp tratam o autopreenchimento?
  8. Exemplo prático: login em um app de transporte por aplicativo
  9. Quais são os erros mais comuns?
  10. Como a OmniChannels.ai ajuda

Pontos principais

  • O Android tem duas APIs: SMS Retriever (mensagem de até 140 bytes com um código de uso único e um hash do app de 11 caracteres) e SMS User Consent (o usuário aprova o compartilhamento de uma mensagem).
  • No iOS, defina o campo com o tipo de conteúdo one-time-code; códigos vinculados ao domínio terminam com uma última linha com @domínio, um espaço e #código, com suporte a partir do iOS 14.
  • Na web, adicione autocomplete="one-time-code" ao input e chame navigator.credentials.get com o transporte sms no Chrome para Android; o Safari usa o atributo.
  • Uma única mensagem pode atender aos três se o hash do app ficar acima de uma última linha com @domínio #código, mas teste em aparelhos e operadoras reais.
  • Os templates de autenticação do WhatsApp oferecem os botões copiar código, um toque e zero toque; o zero toque é exclusivo do Android.

Este guia é para desenvolvedores e donos de produto que querem que o código de verificação seja preenchido sozinho no Android, no iPhone e na web. Ele explica o que cada plataforma exige do SMS, como escrever uma única mensagem que sirva às três, como os templates de autenticação do WhatsApp tratam o autopreenchimento e o que costuma dar errado.

Como funciona o autopreenchimento de OTP em cada plataforma?

Cada plataforma lê o SMS de um jeito, então não existe um único interruptor. O Android exige um hash do app ou o consentimento do usuário, o iOS detecta os códigos por conta própria e os navegadores leem uma última linha formatada.

Plataforma Mecanismo O que o SMS precisa ter Ação do usuário
App Android SMS Retriever API Até 140 bytes, um código de uso único e um hash do app de 11 caracteres Nenhuma
App Android SMS User Consent API Uma mensagem com um código de uso único Aprova o compartilhamento de uma mensagem
App iOS e iPadOS Preenchimento automático de código de segurança Um código que o iOS consiga detectar; formato vinculado ao domínio recomendado Toca na sugestão
Web (Safari) autocomplete="one-time-code" Última linha vinculada ao domínio Toca na sugestão
Web (Chrome para Android) WebOTP API Última linha @host #code Confirma o aviso

Tudo isso só ajuda se o SMS chegar. Se ele não chegar, veja OTP não recebido.

Como funciona a SMS Retriever API do Android?

Seu app pede ao Google Play Services que escute uma mensagem, e essa mensagem traz um hash que identifica o app. Não é preciso nenhuma permissão extra no app.

A documentação do Google lista três requisitos para a mensagem de verificação. Ela deve:

  1. ter no máximo 140 bytes;
  2. conter um código de uso único que o app devolve ao seu servidor para concluir a verificação;
  3. incluir uma string de hash de 11 caracteres que identifica o app.

Todo o resto da mensagem fica a seu critério. O fluxo é: o app inicia a API enquanto solicita o SMS, o seu servidor envia a mensagem, o Play Services a encaminha ao app, e o app extrai o código e o devolve ao servidor para validação. O servidor também deve verificar se o código é válido e não expirou.

Como obtenho o hash de 11 caracteres?

O Google informa que o hash são os 11 primeiros caracteres de um hash codificado em base64. Ele é calculado a partir do certificado de assinatura do app, seguindo os passos com keytool da documentação do Google. Se o Google Play gerencia a assinatura do app, importe esse certificado para o cálculo. Se você assina diretamente, use o keystore e o alias de certificado de produção.

Como o hash depende do certificado de assinatura, uma build assinada com outra chave terá outro hash. Considere isso ao testar builds de debug com mensagens de produção e confirme o hash de cada configuração de assinatura que você publicar.

E se eu preferir não gerenciar um hash?

Use a SMS User Consent API. A documentação do Google diz que o usuário é consultado antes de uma mensagem ser compartilhada, e a mensagem inteira passa a ficar disponível para o app, que extrai o código. Segundo a página do Google, a mensagem deve conter uma sequência alfanumérica de 4 a 10 caracteres com pelo menos um número, o listener cobre cinco minutos e você pode, opcionalmente, restringir a um remetente. Inicie a API antes de o SMS chegar: mensagens recebidas antes não são encaminhadas.

Como o iOS e o iPadOS preenchem um código automaticamente?

O iOS detecta um SMS com um código de uso único e o oferece em campos que se declaram como campos de código. A Apple documenta dois passos para você.

  1. Defina o tipo de conteúdo do campo. No UIKit, defina textContentType como .oneTimeCode. No SwiftUI, use o modificador textContentType com o mesmo valor. Em um site, defina autocomplete="one-time-code" no input.
  2. Se quiser, vincule o código ao seu domínio. A partir do iOS 14 e do macOS Big Sur, a Apple permite formatar o SMS para que o preenchimento automático sugira o código apenas quando o site no Safari ou o domínio associado do app corresponder. Isso dificulta enganar alguém para digitar um código em um site de phishing.

O formato, como a Apple o documenta: qualquer texto primeiro e, depois, uma última linha com o seu domínio precedido de @, um espaço e o código precedido de #.

Your Example code is 123456.

@example.com #123456

Em um app, adicione o domínio vinculado aos domínios associados do app, ou o preenchimento automático não vai sugerir o código. Códigos padrão sem vínculo continuam sendo detectados, mas a Apple recomenda o formato vinculado ao domínio.

Como funciona o autopreenchimento de OTP na web?

Adicione primeiro o atributo e depois o JavaScript para os navegadores que o suportam.

<input type="text" inputmode="numeric"
       autocomplete="one-time-code" name="otp" />

A documentação do Chrome recomenda o atributo para compatibilidade entre navegadores e diz que o Safari o usa para sugerir o código de um SMS formatado corretamente, embora não tenha a API JavaScript WebOTP.

No Chrome para Android, chame o WebOTP com o transporte sms. A API exige uma origem segura (HTTPS), e um AbortController permite cancelar a solicitação pendente se o usuário digitar o código manualmente.

if ("OTPCredential" in window) {
  const ac = new AbortController();
  const form = document.querySelector("form");
  const input = document.querySelector("input[autocomplete=one-time-code]");

  form.addEventListener("submit", () => ac.abort());

  navigator.credentials
    .get({ otp: { transport: ["sms"] }, signal: ac.signal })
    .then((otp) => {
      input.value = otp.code;
      form.submit();
    })
    .catch(() => {}); // user dismissed, or no matching SMS
}

O SMS deve seguir o formato vinculado à origem da especificação WICG e do guia do Chrome: um código de quatro a dez caracteres alfanuméricos com pelo menos um número antes da última linha e, depois, uma última linha que começa com @, o host, um único espaço e # mais o código. O host não pode conter espaços em branco.

Um único SMS funciona no Android, no iOS e na web?

Muitas vezes sim, porque as regras são compatíveis. Coloque o texto legível primeiro, o hash do Android em uma linha acima do final e a linha vinculada ao domínio por último. Esse layout foi montado a partir das regras documentadas, não é uma garantia dos fornecedores, então teste.

Your Example code is 483921. Do not share it.
Ab3dE+9xYz1
@example.com #483921

Por que essa ordem: a Apple e a especificação web querem o domínio e o código na última linha. O Google exige o hash de 11 caracteres em algum ponto da mensagem, mas, na página que verificamos, não fixa a posição. O exemplo acima tem 78 bytes em caracteres latinos simples, bem dentro do limite de 140 bytes.

Checklist antes de publicar:

  1. O código é um único token, bem separado dos demais números do texto.
  2. O domínio da última linha corresponde ao site e ao domínio associado do app.
  3. O tamanho total fica dentro de 140 bytes na variante com Retriever.
  4. O hash corresponde à chave de assinatura da build em teste.
  5. Teste feito em um aparelho de cada plataforma, nas operadoras pelas quais você realmente envia.

E com texto em árabe e Unicode?

Mantenha o código e as duas partes legíveis por máquina em texto simples. O limite do Google é em bytes, e um SMS Unicode comporta bem menos caracteres que um GSM-7: 70 contra 160 em um único segmento (veja limites de caracteres do SMS e Unicode). Uma frase em árabe consome o orçamento rapidamente, e um único caractere fora do GSM converte a mensagem inteira para Unicode.

Abordagem segura: mantenha o código em dígitos latinos, @domínio #código em ASCII e o texto em árabe curto. Não encontramos documentação oficial sobre o autopreenchimento de códigos escritos em outros sistemas de dígitos, por isso deixamos esse ponto de fora e recomendamos testar antes de usar.

Como os templates de autenticação do WhatsApp tratam o autopreenchimento?

Os templates de autenticação da Meta vêm com três estilos de botão, cada um com um texto de corpo fixo no formato <code> is your verification code.

Botão O que faz Observações
Copiar código O usuário toca para copiar o código e depois o cola no app Funciona sem mudanças no app
Autopreenchimento com um toque No Android, um botão abre o app e entrega o código Exige package_name e signature_hash em supported_apps
Zero toque Sem botão; o cliente do WhatsApp transmite o código ao app Somente Android; é preciso aceitar os termos de zero toque da Meta

A documentação da Meta também observa que, no iOS 26 e posteriores, as sugestões do teclado oferecem o autopreenchimento sem integração, e que usuários de plataformas sem zero toque recebem um botão de copiar código. Você pode definir uma expiração com code_expiration_minutes, e a API de prévia aceita valores de 1 a 90 minutos. Compare os canais em OTP por WhatsApp vs OTP por SMS.

Exemplo prático: login em um app de transporte por aplicativo

A "Qafila Rides" (fictícia) tem um app Android, um app iOS e um site móvel em qafila.example.

  1. O app Android inicia o SMS Retriever quando o usuário toca em "Enviar código".
  2. O backend gera um código de seis dígitos, válido por alguns minutos, e envia a mensagem de três linhas acima pela API de SMS.
  3. O Android entrega a mensagem ao app. O iOS oferece o código acima do teclado. No site móvel, o Safari o sugere e o Chrome o preenche via WebOTP.
  4. O servidor valida o código uma única vez, rejeita reutilização e códigos expirados, e limita a taxa de solicitações.
  5. Se o SMS não for confirmado em um curto intervalo, o backend oferece um template de autenticação do WhatsApp como segundo caminho.

Quais são os erros mais comuns?

  • Código misturado com outros números. Números extras (telefone, preço, data) ao lado do código confundem a detecção. Use um código por mensagem.
  • Hash errado. O hash acompanha o certificado de assinatura. Um hash de uma chave de debug não corresponde a uma build de produção.
  • Domínio diferente. @example.com deve corresponder ao site ou ao domínio associado; caso contrário, o iOS e o WebOTP não oferecem o código.
  • Última linha quebrada. Qualquer coisa depois de #code, um espaço faltando ou espaços em branco dentro do domínio quebram o formato.
  • Mensagem longa demais ou carregada de Unicode, o que ultrapassa o limite de 140 bytes do Retriever.
  • Escutar tarde demais. A User Consent API ignora mensagens recebidas antes de ser iniciada.
  • Usar o autopreenchimento como segurança. O autopreenchimento é uma conveniência. Continue validando no servidor, expirando os códigos e limitando as tentativas, e fique atento à fraude de SMS pumping.
  • Escopo. Este guia cobre o comportamento documentado no momento da redação. As regras das plataformas mudam, então confira as fontes linkadas antes do lançamento.

Para a redação da mensagem e a escolha da expiração, veja nosso guia de mensagens de OTP e autenticação.

Como a OmniChannels.ai ajuda

A OmniChannels.ai envia OTP por SMS e WhatsApp pela conectividade direta com operadoras da BroadNet, para que você controle o texto exato da mensagem de que o seu formato de autopreenchimento depende. Os templates do WhatsApp cobrem a autenticação com copiar código, um toque e zero toque. O fallback entre canais, por exemplo WhatsApp e depois SMS, é configurado por caso de uso, e os status de entrega chegam em um único formato de webhook. Veja a documentação da API de SMS, a documentação da API do WhatsApp e a solução de OTP.

Perguntas frequentes

Qual é o formato de mensagem da SMS Retriever API?

A documentação do Google diz que a mensagem não pode ter mais de 140 bytes, deve conter um código de uso único que o app devolve ao seu servidor e incluir um hash de 11 caracteres que identifica o app. O restante do conteúdo é livre. O hash permite que o Google Play Services encaminhe a mensagem ao app certo sem permissões extras.

Preciso de um hash do app para a SMS User Consent API?

A visão geral do Google sobre a SMS User Consent API não descreve um hash do app. Em vez disso, o usuário vê um aviso e decide se compartilha a mensagem com o seu app. O app precisa começar a escutar antes de o SMS chegar e depois extrai o código do próprio texto da mensagem.

O que é um código SMS vinculado ao domínio no iOS?

É um SMS cuja última linha vincula o código ao seu domínio: o domínio precedido de @, um espaço e o código precedido de #. A Apple documenta o recurso a partir do iOS 14. O preenchimento automático só sugere o código quando o site aberto no Safari, ou um domínio associado do app, corresponde ao domínio da mensagem.

Como o WebOTP lê o SMS?

A página chama navigator.credentials.get com a opção otp e o transporte sms. Quando chega uma mensagem cuja última linha é @host #código e o host corresponde à origem da página, o navegador pede confirmação ao usuário e devolve o código. É preciso HTTPS, e o navegador documentado é o Chrome para Android.

Por que o meu OTP não é preenchido automaticamente?

As causas mais comuns são um código que não se identifica com clareza, um hash do app errado ou ausente no Android, uma última linha fora do formato @domínio #código, um domínio diferente do da página ou um texto que ultrapassa o limite de bytes. Confira cada ponto com as regras de formato e teste em um aparelho real.

O WhatsApp oferece autopreenchimento de OTP?

Sim. Os templates de autenticação da Meta aceitam um botão de copiar código, um botão de autopreenchimento com um toque e a opção de zero toque. Um toque e zero toque exigem o nome do pacote Android e o hash de assinatura. O zero toque só funciona no Android; em outras plataformas o usuário recebe o botão de copiar código.

Fontes

  1. SMS Retriever API: perform SMS verification — Google for Developers
  2. SMS User Consent API: request a one-time code — Google for Developers
  3. Enabling AutoFill for domain-bound SMS codes — Apple Developer
  4. Verify phone numbers on the web with the WebOTP API — Chrome for Developers
  5. WebOTP API — WICG specification
  6. Authentication templates — WhatsApp Business Platform, Meta for Developers