O que o Web NFC consegue gravar, e o que ele não consegue?
Qualquer mensagem NDEF, de texto a dados MIME e tipos externos, formatando uma tag virgem no caminho, e do Chrome 100 em diante um bloqueio permanente. Nada abaixo do NDEF: nenhuma senha, nenhuma página de configuração, nenhum comando bruto. E uma gravação que falha informa só que falhou: a página lê a tag de volta antes de tentar outra vez.
O que write() faz
write() prepara uma mensagem e espera uma tag. No artigo do Chrome sobre o Web NFC, a promessa dela se resolve assim que o usuário toca numa tag e a mensagem é gravada, nas mesmas condições de uma leitura: um gesto do usuário, a permissão, e o NFC presente e ligado.
Uma string simples vira um registro de texto, em UTF-8 e no idioma do documento a não ser que o registro diga outra coisa. Qualquer outra coisa é uma mensagem de registros: um URL, um URL absoluto, dados MIME, um cartaz inteligente, um tipo externo como example.com:foo, ou um registro vazio.
Isso cobre o que a maior parte das tags carrega. Cobre também um registro de aplicação do Android, que o artigo grava como o tipo externo android.com:pkg, com os limites descritos na página do registro de aplicação.
As tags que já guardam uma mensagem
Por padrão, a gravação substitui o que quer que a tag guarde. A especificação põe overwrite em true a não ser que se diga outra coisa; em false, a gravação lê a tag antes e é rejeitada com NotAllowedError se encontrar registros NDEF.
Uma tag virgem é tratada por você. Quando a tag no alcance não está formatada e pode ser formatada para NDEF, a especificação a formata e depois grava. O artigo acrescenta que uma tag dessas é lida como um único registro vazio, que é como uma página consegue reconhecer uma antes de gravar.
A especificação recomenda chamar write() a partir de um evento reading, para que a página confira o conteúdo existente ou o número de série e grave só na tag em que ela queria gravar.
Bloquear a partir de uma página
makeReadOnly() chegou no Chrome 100 no Android, e o artigo o descreve como um processo só de ida que não pode ser revertido. Teste-o com 'makeReadOnly' in NDEFReader.prototype antes de oferecê-lo.
Amarre-o a uma ação separada da gravação, feita depois que o conteúdo foi conferido num segundo celular. Se vale bloquear é decidido na página do bloqueio.
O que uma página não consegue fazer
O Web NFC para no NDEF por projeto. O artigo lista o que está fora do escopo: as operações de baixo nível como ISO-DEP, NFC-A, NFC-B e NFC-F, o ponto a ponto, e a emulação de cartão pelo host.
Isso exclui tudo o que um chip faz além de guardar uma mensagem. Uma página não consegue pôr nem usar uma senha, gravar uma página de configuração, ligar um contador ou ler uma assinatura, tudo isso passando por comandos brutos.
Uma gravação que falha também diz pouco. A especificação a rejeita com NetworkError quando a transferência falha, sem dizer até onde ela foi, então leia a tag de volta antes de tentar outra vez. O exemplo de leitura depois da gravação do artigo, um write() seguido de um scan() curto, faz exatamente isso.
Perguntas frequentes
O Web NFC consegue pôr uma senha numa tag?
Não. As senhas são postas com comandos de chip, e o Web NFC para no NDEF: as operações de baixo nível estão fora do escopo dele.
O que acontece se a tag já guardar uma mensagem?
Por padrão ela é substituída. Com overwrite em false, a gravação lê a tag antes e é rejeitada se encontrar registros NDEF.
Uma página consegue tornar uma tag somente leitura?
A partir do Chrome 100 no Android, com makeReadOnly. O bloqueio é permanente, então ele vem depois que o conteúdo foi conferido.
Por que a minha gravação falhou com NetworkError?
A especificação o levanta quando a transferência para a tag falha. Leia a tag de volta antes de tentar outra vez, já que a página não consegue dizer até onde a gravação foi.