Saltar al contenido
Idioma: ES

¿Qué tiene que declarar una app iOS antes de leer una etiqueta?

Tres cosas, todas en el proyecto: la capacidad de lectura de etiquetas por campo cercano, que añade la autorización; una cadena NFCReaderUsageDescription en Info.plist, sin la cual Apple dice que la aplicación se cierra al intentar leer; y, para una sesión de etiqueta, los identificadores de aplicación ISO 7816 o los códigos de sistema FeliCa que va a seleccionar.

La capacidad y su autorización

Una aplicación lee etiquetas solo con la capacidad de lectura de etiquetas por campo cercano activada para su objetivo. El ejemplo de lector de etiquetas de Apple enumera lo que hace ese paso: añade la función de lectura de etiquetas al identificador de la aplicación y la autorización de formatos de sesión de lectura al archivo de autorizaciones.

La página de referencia de la autorización enumera ahora un solo valor, TAG, descrito como acceso de lectura y escritura mediante NFCTagReaderSession, y su instrucción es activar la capacidad en Xcode en lugar de editar el archivo.

La descripción de uso

NFCReaderUsageDescription, que Xcode enseña como Privacy - NFC Scan Usage Description, es una cadena en Info.plist que dice por qué la aplicación quiere el aparato NFC. Su página de referencia la marca como obligatoria para cualquier aplicación que use API que accedan a ese aparato.

Su ausencia no es un aviso. El ejemplo declara que una aplicación que intenta leer una etiqueta sin la clave y su cadena se cierra.

Es además un texto distinto del que enseña la hoja de lectura. La documentación de alertMessage separa los dos: la descripción de uso explica por qué pregunta la aplicación, y el mensaje de la alerta dice qué hacer durante una lectura.

Identificadores de aplicación y códigos de sistema

Una sesión de etiqueta entrega una etiqueta ISO 7816 solo para los identificadores de aplicación enumerados bajo com.apple.developer.nfc.readersession.iso7816.select-identifiers en Info.plist. La documentación de NFCISO7816Tag describe lo que ocurre: la sesión envía un SELECT por cada identificador, en el orden de la lista, y declara la etiqueta tras el primero que sale bien, con el identificador seleccionado en initialSelectedAID.

El orden importa, por tanto, y un identificador en particular también. Enumerar D2760000850101, la aplicación NDEF de las etiquetas MIFARE DESFire, hace que una etiqueta así llegue como NFCISO7816Tag; dejarlo fuera entrega la misma etiqueta como NFCMiFareTag.

Las etiquetas FeliCa necesitan sus códigos de sistema enumerados de la misma manera, en la clave que la referencia de Apple llama códigos de sistema ISO 18092 para la sesión de lectura de etiquetas NFC. Desde iOS 26.4, una Configuration de sesión puede estrechar los identificadores por sesión, pero solo entre los que ya están en Info.plist: la referencia dice que las entradas desconocidas se descartan.

Lo que el código sigue comprobando

Las declaraciones no garantizan el aparato. readingAvailable dice si el dispositivo puede leer etiquetas, y el resumen del marco de trabajo de Apple pide comprobarlo antes de empezar una sesión.

Y algunos identificadores no se pueden seleccionar en absoluto. La documentación de la sesión de etiqueta dice que no admite seleccionar identificadores de aplicación relacionados con el pago, y remite a las aplicaciones de la Unión Europea a NFCPaymentTagReaderSession.

Preguntas frecuentes

¿Una app que solo lee NDEF necesita la autorización?

Sí. El ejemplo de lector de etiquetas de Apple, que solo lee NDEF, activa la capacidad de lectura de etiquetas, y esa capacidad es la que añade la autorización.

¿Qué pasa si falta NFCReaderUsageDescription?

El ejemplo de Apple declara que la aplicación se cierra cuando intenta leer una etiqueta sin la clave y su cadena.

¿Por qué mi etiqueta DESFire llega como ISO 7816 en lugar de MIFARE?

Info.plist enumera D2760000850101, el identificador de la aplicación NDEF en las etiquetas DESFire. Quítalo para recibir la etiqueta como NFCMiFareTag.

¿Puede una app seleccionar la aplicación de una tarjeta de pago?

Mediante NFCTagReaderSession no, que no admite identificadores relacionados con el pago. En la Unión Europea, Apple documenta NFCPaymentTagReaderSession para ese caso.