Ir para o conteúdo
Idioma: PT

Uma página web consegue ler uma tag NFC?

Sim, no Chrome do Android, pelo Web NFC. A página tem de ser servida por HTTPS num quadro de nível superior, começar a primeira leitura num gesto do usuário, e ter a permissão do visitante. Ela recebe então cada mensagem NDEF com o número de série da tag. Nenhum outro navegador traz a API, e nada dela chega ao iPhone.

Onde isso funciona

O Web NFC chegou no Chrome 89 para Android, segundo o artigo do Chrome sobre o Web NFC. A entrada do estado das plataformas do Chrome não lista suporte algum no computador, no iOS nem na WebView do Android, então uma página mostrada dentro do navegador embutido de um aplicativo também não o recebe.

Os outros motores disseram não. A posição publicada do WebKit se opõe à API, citando a privacidade, a segurança e a independência de aparelho, e a posição da Mozilla é negativa. A especificação é incubada por um Community Group do W3C em vez de publicada como uma Recomendação do W3C.

Uma página que lê tags portanto atende os visitantes no Android que usam o Chrome, e mais ninguém. Isso convém muito mais a ferramentas de equipe em celulares que um projeto controla do que a qualquer coisa que o público vá abrir.

O que tem de acontecer antes de uma leitura

A página é servida por HTTPS, num quadro de nível superior e não num iframe. O primeiro scan() é chamado em resposta a um gesto do usuário, como um toque num botão, e é aí que o Chrome pede a permissão nfc. Uma vez concedida, o exemplo do próprio artigo a confere pela API de permissões e começa a ler sem esperar um gesto.

O celular também precisa do hardware NFC, ligado. A detecção de recurso não diz isso: 'NDEFReader' in window diz que o navegador suporta o Web NFC, e a promessa é rejeitada depois se o hardware faltar.

A especificação nomeia as rejeições. NotAllowedError quer dizer que a permissão foi recusada, NotSupportedError que não há adaptador NFC, e NotReadableError que o navegador não tem autorização para usá-lo, por exemplo por causa de um ajuste do usuário.

O que a página recebe

Cada tag traz um evento reading com duas coisas: a mensagem, e serialNumber, o identificador que a tag usa para a anticolisão, ou uma string vazia quando não há nenhum. Esse identificador não é um segredo, como explica a página do UID.

A mensagem guarda registros que a própria página decodifica, por recordType: texto, URL, URL absoluto, MIME, cartaz inteligente, tipo externo, vazio, desconhecido e tipos locais. Cada registro expõe a carga útil dele como um DataView, e decodificar o texto fica a cargo da página.

Uma tag que o navegador não consegue ler como NDEF dispara readingerror em vez disso. Sem um ouvinte para ele, uma tag não suportada parece que não fez nada.

O que interrompe isso

A página tem de ficar visível. O Chrome suspende as operações NFC enquanto a página está escondida e as retoma quando ela volta, e ele bloqueia o rádio quando a tela está desligada ou o celular está bloqueado.

Uma tag tocada antes de a leitura começar vai para o Android, e não para a página. O artigo diz isso entre as dicas dele: o Android trata as tags no nível do sistema operacional antes de o Web NFC estar operacional, então uma tag que guarda um link pode disparar o tratamento que o próprio celular dá a esse link.

E a leitura termina com a página. Não existe leitura em segundo plano, então uma página não consegue esperar tags num bolso do jeito que um aplicativo registrado no manifesto dele consegue.

Perguntas frequentes

O Web NFC funciona no iPhone?

Não. A entrada do estado das plataformas do Chrome não lista suporte no iOS, e a posição publicada do WebKit se opõe à API por razões de privacidade, segurança e independência de aparelho.

Uma página consegue ler tags em segundo plano?

Não. O Chrome suspende as operações NFC enquanto a página está escondida, e bloqueia o rádio quando a tela está desligada ou o celular está bloqueado.

O Web NFC consegue ler o UID da tag?

O evento reading expõe serialNumber, o identificador que a tag usa para a anticolisão, ou uma string vazia quando não há nenhum. Ele identifica uma tag e não prova nada sobre ela.

Funciona na WebView de um aplicativo Android?

Não. A entrada do estado das plataformas do Chrome lista o Web NFC só no Chrome do Android, sem suporte na WebView, então um aplicativo que precisa de NFC chama a API nativa.