¿Puede una página web leer una etiqueta NFC?
Sí, en Chrome para Android, mediante Web NFC. La página se sirve por HTTPS en un marco de primer nivel, empieza su primer escaneo desde un gesto, y tiene el permiso de quien la visita. Recibe entonces cada mensaje NDEF con el número de serie de la etiqueta. Ningún otro navegador trae la API.
Dónde funciona
Web NFC llegó en Chrome 89 para Android, según el artículo de Chrome sobre Web NFC. La ficha de estado de la plataforma Chrome no enumera compatibilidad en escritorio, en iOS ni en el WebView de Android, así que una página abierta dentro del navegador incrustado de una aplicación tampoco la tiene.
Los demás motores han dicho que no. La posición publicada de WebKit se opone a la API, alegando privacidad, seguridad e independencia del dispositivo, y la posición de Mozilla es negativa. La especificación la incuba un grupo comunitario del W3C en lugar de publicarse como recomendación del W3C.
Una página que lee etiquetas sirve por tanto a quien visita desde Android con Chrome, y a nadie más. Eso encaja con las herramientas del personal en teléfonos que el proyecto controla mucho mejor que con cualquier cosa que abra el público.
Lo que tiene que pasar antes de un escaneo
La página se sirve por HTTPS, en un marco de primer nivel y no en un iframe. El primer scan() se llama como respuesta a un gesto, por ejemplo tocar un botón, y es entonces cuando Chrome pide el permiso nfc. Una vez concedido, el propio ejemplo del artículo lo comprueba mediante la API de permisos y empieza a escanear sin esperar un gesto.
El teléfono necesita además el aparato NFC, encendido. La detección de la función no dice eso: 'NDEFReader' in window dice que el navegador admite Web NFC, y la promesa se rechaza después si falta el aparato.
La especificación nombra los rechazos. NotAllowedError quiere decir que el permiso se denegó, NotSupportedError que no hay adaptador NFC, y NotReadableError que el navegador no tiene permitido usarlo, por ejemplo por un ajuste.
Lo que recibe la página
Cada etiqueta trae un evento reading con dos cosas: el mensaje, y serialNumber, el identificador que la etiqueta usa para la anticolisión, o una cadena vacía cuando no hay ninguno. Ese identificador no es un secreto, como explica la página del UID.
El mensaje contiene registros que la página descodifica ella misma, por recordType: texto, URL, URL absoluta, MIME, cartel inteligente, tipo externo, vacío, desconocido y tipos locales. Cada registro expone su carga como un DataView, y descodificar el texto queda de parte de la página.
Una etiqueta que el navegador no puede leer como NDEF dispara readingerror en su lugar. Sin un oyente para él, una etiqueta no admitida parece que no ha pasado nada.
Lo que la detiene
La página tiene que seguir visible. Chrome suspende las operaciones NFC mientras la página está oculta y las reanuda cuando vuelve, y corta la radio cuando la pantalla está apagada o el teléfono bloqueado.
Una etiqueta tocada antes de que empiece el escaneo va a Android, no a la página. El artículo lo dice entre sus consejos: Android trata las etiquetas al nivel del sistema operativo antes de que Web NFC esté operativo, así que una etiqueta que contiene un enlace puede disparar el trato que el teléfono da a ese enlace.
Y el escaneo termina con la página. No hay lectura en segundo plano, así que una página no puede esperar etiquetas en un bolsillo como sí puede una aplicación registrada en su manifiesto.
Preguntas frecuentes
¿Web NFC funciona en el iPhone?
No. La ficha de estado de la plataforma Chrome no enumera compatibilidad con iOS, y la posición publicada de WebKit se opone a la API por privacidad, seguridad e independencia del dispositivo.
¿Puede una página leer etiquetas en segundo plano?
No. Chrome suspende las operaciones NFC mientras la página está oculta, y corta la radio cuando la pantalla está apagada o el teléfono bloqueado.
¿Web NFC puede leer el UID de la etiqueta?
El evento de lectura expone serialNumber, el identificador que la etiqueta usa para la anticolisión, o una cadena vacía cuando no hay ninguno. Distingue una etiqueta y no prueba nada de ella.
¿Funciona en el WebView de una app Android?
No. La ficha de estado de la plataforma Chrome enumera Web NFC solo para Chrome en Android, sin compatibilidad con el WebView, así que una aplicación que necesita NFC llama a la API nativa.