¿Sesión NDEF o sesión de etiqueta en una app iOS?
Una sesión NDEF, cuando la aplicación solo lee o escribe mensajes: cubre los tipos 1 a 5 del NFC Forum y necesita las menos declaraciones. Una sesión de etiqueta, desde iOS 13, cuando la aplicación tiene que hablar con el chip mismo mediante APDU ISO 7816, bloques ISO 15693, FeliCa o comandos MIFARE. Solo corre una sesión a la vez.
Lo que hace una sesión NDEF
Core NFC lee datos NDEF de etiquetas de los tipos 1 a 5, según el resumen del marco de trabajo de Apple, y NFCNDEFReaderSession es la sesión hecha para ello. Entrega cada mensaje a su delegado mediante readerSession(_:didDetectNDEFs:), sin objeto de etiqueta y sin comandos.
Desde iOS 13, la misma sesión puede entregar además las etiquetas mismas. Un delegado que implementa readerSession(_:didDetect:) recibe objetos NFCNDEFTag, se conecta a uno, y puede consultarlo, escribirlo y bloquearlo, como describe la página de la escritura.
La marca invalidateAfterFirstRead decide cuánto vive la sesión. Puesta a verdadero, termina tras la primera etiqueta leída con éxito; puesta a falso, sigue leyendo hasta que expira o la cancelan. La nota de Apple sobre el inicializador dice que hay que ponerla a falso en una sesión que escribe.
Lo que añade una sesión de etiqueta
NFCTagReaderSession, disponible desde iOS 13, detecta etiquetas por tecnología de radio y no por contenido. Sus opciones de sondeo eligen lo que busca: iso14443 para etiquetas compatibles con ISO 7816 y MIFARE, iso15693 para las etiquetas de vecindad, iso18092 para FeliCa, y desde iOS 16 una opción pace.
Cada etiqueta detectada llega como un valor NFCTag cuyo caso da el protocolo: NFCISO7816Tag para APDU, NFCISO15693Tag para comandos de bloque, NFCFeliCaTag, o NFCMiFareTag para comandos MIFARE. Cada uno de ellos se ajusta además a NFCNDEFTag, así que una sesión de etiqueta también lee y escribe NDEF.
El precio está en las declaraciones. Además de la autorización y la descripción de uso que necesita cualquier aplicación con Core NFC, la documentación de la clase entrega una etiqueta ISO 7816 solo para los identificadores de aplicación enumerados en Info.plist, como explica la página de las declaraciones.
Una sesión a la vez
Solo puede estar activa en el sistema una sesión de lectura de cualquier tipo a la vez, dice la documentación de la clase base, y las sesiones de más esperan en una cola atendida por orden. Una aplicación que empieza una segunda sesión con la primera abierta espera a que termine la primera.
Una sesión necesita además el aparato. readingAvailable responde antes de crear nada, y Apple pide comprobarlo primero; Core NFC no está disponible en las extensiones de aplicación en absoluto.
Y una sesión termina para siempre. Una vez invalidada ya no puede volver a leer, y la aplicación crea una nueva, que es lo que hace el ejemplo de lector de etiquetas de Apple tras cada invalidación.
Elegir entre las dos
| Pregunta | Sesión NDEF | Sesión de etiqueta |
|---|---|---|
| Disponible desde | iOS 11 para leer, iOS 13 para escribir | iOS 13 |
| Lo que entrega | Mensajes, o etiquetas NDEF mediante didDetect | Etiquetas por protocolo, todas capaces de NDEF |
| Comandos al chip | Ninguno | APDU, bloques ISO 15693, comandos FeliCa y MIFARE |
| Declaraciones de más | Ninguna | Identificadores de aplicación para ISO 7816, códigos de sistema para FeliCa |
Elige la sesión NDEF cuando la etiqueta lleva un mensaje y el trabajo de la aplicación es ese mensaje. Elige la sesión de etiqueta cuando la aplicación necesita el chip: un identificador, un contador, una contraseña, un bloque de memoria fuera del NDEF.
Preguntas frecuentes
¿Puede una app iOS leer una etiqueta sin la hoja de lectura?
No. Una sesión de lectura enseña la alerta de lectura del sistema mientras corre, y la aplicación solo elige el mensaje que va en ella, mediante alertMessage.
¿Una sesión de etiqueta lee NDEF también?
Sí. Todos los tipos de etiqueta que entrega se ajustan además a NFCNDEFTag, así que la aplicación puede leer y escribir NDEF tras conectarse.
¿Pueden correr dos sesiones a la vez?
No. Solo hay activa una sesión de lectura de cualquier tipo en el sistema, y las demás esperan en una cola atendida por orden.
¿Por qué mi sesión NDEF termina tras la primera etiqueta?
invalidateAfterFirstRead está a verdadero, y el delegado recibe readerSessionInvalidationErrorFirstNDEFTagRead cuando la sesión termina. Ponla a falso para seguir leyendo o para escribir.