Como ler e gravar NFC a partir do seu próprio código?
Pela API da plataforma em que o código roda: o framework NFC no Android, o Core NFC no iPhone, o Web NFC no Chrome para Android, e o PC/SC para um leitor ligado a um computador. Cada uma decide o que um programa envia a uma tag, quando ele fica à escuta, e o que ele declara antes.
Quatro portas de entrada, quatro conjuntos de regras
No Android, o framework NFC entrega uma tag descoberta a uma atividade, que pode ler e gravar NDEF, enviar comandos brutos à tag, ou responder a um leitor pela emulação de cartão pelo host.
No iPhone, o Core NFC deixa um aplicativo ler dentro de uma sessão que o sistema mostra e encerra, o modelo que este site descreve na página da folha de leitura.
Num navegador, o Web NFC lê e grava NDEF a partir de uma página da web. O Chrome o documenta como disponível no Android a partir do Chrome 89, e o limita ao NDEF de propósito: nada de comandos brutos, nada de emulação de cartão.
Num computador, um leitor USB é alcançado pelo PC/SC, a especificação que os computadores usam para falar com leitores de cartão inteligente, e o programa fala com a tag através do leitor em vez de através de um celular.
Eles diferem no que conseguem enviar a uma tag, e diferem mais ainda em quando têm permissão para ficar à escuta. Essa segunda diferença é a que uma portabilidade de uma plataforma para outra erra.
O que o código tem de declarar
Nenhum deles alcança o rádio sem se anunciar. Um aplicativo Android pede android.permission.NFC, que a referência das permissões classifica como normal, então ela é concedida na instalação sem um pedido.
A partir do Android 17, um aplicativo que mira um SDK mais recente também tem de proteger com android.permission.DISPATCH_NFC_MESSAGE cada atividade que recebe tags, segundo o guia de NFC do Android, para que só o serviço de NFC possa abri-la.
Um aplicativo de iPhone declara a capacidade de leitura de tags e uma descrição de uso antes que o Core NFC abra uma sessão, e uma sessão de tag que lê tags ISO 7816 enumera também os identificadores de aplicação que vai selecionar. A página das declarações cobre as três.
Uma página da web precisa de uma origem segura, de um quadro de nível superior e de um gesto do visitante, como um toque num botão, antes que o Chrome peça a permissão nfc.
O que o campo faz com o código
Uma tag está presente enquanto uma mão a segura parada, e o código roda dentro dessa janela. A referência de TagTechnology marca cada troca como bloqueante e a proíbe na thread principal, e uma tag que sai no meio de uma troca levanta TagLostException.
Os testes numa mesa escondem isso. O celular fica deitado, a tag não se mexe, e a janela nunca se fecha. O mesmo código na mão de um visitante encontra uma janela que se fecha na metade, e um código que nunca encontrou esse caso o trata como uma pane.
A tag também não é o que era um segundo atrás. O Android guarda em cache o que leu na descoberta e nunca atualiza esses valores, então um programa que grava e depois confia na cópia em cache lê de volta a própria suposição.
Conferir o que o código gravou
Leia o resultado de volta com uma ferramenta que não seja o código em teste. Um defeito que grava o tipo de registro errado consegue lê-lo de volta como o tipo certo, porque o mesmo defeito o decodifica.
O NFC Tools, publicado pela mesma empresa que este site, mostra os registros que uma tag guarda e as tecnologias que ela declara, o que resolve a maior parte das divergências entre um programa e o autor dele.
Depois leia a tag na outra plataforma. Uma mensagem que um analisador Android aceita ainda pode não fazer nada num iPhone, uma decisão de plataforma coberta na página dos registros no iOS.
Todos os guias desta seção
- Android
- iOS e Core NFC
- Web NFC e multiplataforma
- Abaixo do NDEF
- Emulação de cartão em código
- Leitores e aparelhos
- Testes e depuração
Android
- Modo leitor ou despacho em primeiro plano: qual um aplicativo Android deve usar?
- Como declarar as tags que um aplicativo Android deve receber?
- Que classe de tecnologia o código Android deve abrir para uma dada tag?
- Como gravar uma mensagem NDEF a partir de um aplicativo Android?
- Um aplicativo Android consegue reagir a uma tag sem mostrar uma tela?
- Como tratar uma tag que chega enquanto a sua atividade está aberta?
- Que limites do controlador o código Android tem de conferir em tempo de execução?
iOS e Core NFC
- Sessão NDEF ou sessão de tag: qual um aplicativo iOS deve abrir?
- O que um aplicativo iOS tem de declarar antes de poder ler uma tag?
- Como gravar e bloquear uma tag NDEF a partir de um aplicativo iOS?
- Como um aplicativo iOS recebe uma tag lida em segundo plano?
- Como ler várias tags numa mesma sessão do iOS?
- Um aplicativo iOS consegue ler o identificador de uma tag?
Web NFC e multiplataforma
Abaixo do NDEF
- Como enviar um comando bruto para uma tag?
- O que é uma APDU, e quando o seu código precisa de uma?
- Como ler a memória de uma tag Tipo 2 página por página?
- Como ler os blocos de uma tag ISO/IEC 15693?
- Como o código encontra o arquivo NDEF numa tag Tipo 4?
- Como o código se autentica numa tag protegida por senha?
- Como detectar que uma tag saiu do campo?
- Como gravar uma tag para que uma gravação interrompida não possa passar por válida?
- Como gravar as páginas de configuração de uma tag sem estragá-la?
- Como um servidor lê o identificador que uma tag espelha na URL dela?
Emulação de cartão em código
- Como um aplicativo Android emula um cartão com emulação de cartão pelo host?
- Por que um leitor alcança outro aplicativo em vez do seu?
- O que um aplicativo iOS precisa para emular um cartão?
- Um celular consegue emular uma tag NDEF para outro celular?
- A emulação de cartão pelo host funciona com a tela desligada?
Leitores e aparelhos
- Como um computador fala com um leitor NFC USB?
- Que chip leitor serve a um projeto com microcontrolador?
- Por que um módulo leitor de hobby não pega algumas tags?
- O que é uma tag dinâmica, e quando um aparelho precisa de uma?
- Um celular consegue configurar um aparelho que está desligado?
- Como projetar uma antena NFC para o seu próprio circuito?
- O seu próprio aparelho consegue agir como uma tag para um celular?
Testes e depuração
- Por que uma leitura falha com um erro de tag perdida?
- Por que uma sessão do Core NFC termina sozinha?
- Por que um comando expira, e quanto tempo o código deve esperar?
- Dá para testar código NFC sem uma tag na mão?
- Que tags um desenvolvedor deve guardar para testar?
- Como ver o que um aplicativo e uma tag trocam de verdade?
- O que um aplicativo deve fazer quando o NFC está desligado ou ausente?
- Por que um código escrito para um chip quebra em outro do mesmo tipo?
- Um aplicativo NFC deve ser instalado em celulares sem NFC?
Perguntas frequentes
Qual plataforma um primeiro projeto de NFC deve mirar?
O Android, se o projeto precisa falar com a própria tag. O framework dele alcança o NDEF, os comandos brutos e a emulação de cartão, e uma tag consegue abrir um aplicativo fechado. O iOS acrescenta uma sessão que o sistema controla e o Web NFC para no NDEF, então os dois ficam mais fáceis de acrescentar depois que a troca funciona.
Ler tags exige um pedido de permissão?
Não no Android, em que a permissão de NFC é normal e concedida na instalação. O Web NFC pergunta ao visitante, e só em resposta a um gesto como um toque num botão.
Dá para testar código NFC sem um celular?
Analisar e montar mensagens NDEF, sim. Tudo o que depende do campo, como o tempo, uma tag que sai no meio de uma gravação ou um controlador que recusa um comando, só aparece com tags reais em celulares reais.
De onde vêm os comandos específicos de um chip?
Da ficha técnica daquele chip. Esta seção cobre os comandos que os tipos de tag do NFC Forum definem, e deixa o mapa de memória de cada chip para as fichas técnicas em wakdev.com.