Comprender el marco NFC iOS para el intercambio de datos sin contacto

El marco iOS Core NFC ofrece a los desarrolladores la capacidad de construir aplicaciones que lean y escriben etiquetas de comunicaciones de campo cercano (NFC), permitiendo un intercambio de datos rápido, seguro y directo sin contacto. Como la tecnología NFC se convierte en un elemento básico en el comercio minorista, el transporte, el control de acceso y más, entendiendo cómo integrar este marco en su aplicación iOS abre la puerta a experiencias de usuario modernas y libres de fricción.

Una breve descripción de NFC sobre iOS

La comunicación de campo cercano (NFC) es un estándar de conectividad inalámbrica de corto alcance que opera en 13.56 MHz. Apple introdujo el marco NFC Core con iOS 11, originalmente limitado a leer las etiquetas NFC Data Exchange Format (NDEF). Las versiones posteriores iOS ampliaron capacidades: iOS 13 agregó soporte para escribir etiquetas de iPhone y lectura de etiquetas de fondo, mientras que iOS 14 y más tarde mejoró la compatibilidad con ISO‐7816, ISO‐15693, y FeliCa

NFC opera a lo largo de una distancia de unos pocos centímetros, lo que lo hace ideal para escenarios “tap‐to-interact” tales como pago, lealtad, ticketing y verificación de identidad. El marco abstrae la comunicación radio de bajo nivel, dejando que los desarrolladores se centren en la parse y manejo de los datos recibidos de etiquetas NFC.

Capacidades básicas del marco de la NFC

Para comenzar el desarrollo es esencial comprender qué puede hacer el marco básico de la NFC (y no puede) y el marco proporciona:

  • Nota de etiqueta de NNDEF – Lea mensajes NDEF de etiquetas NFC compatibles (ISO 14443, FeliCa, e ISO 15693 en versiones posteriores de iOS).
  • Escribe la etiqueta de NNDEF – Escribe mensajes NDEF para reescritas etiquetas (iOS 13+).
  • Reseña de etiquetas de fondo – Detectar y leer etiquetas NFC incluso cuando su aplicación está en el fondo (iOS 13+).
  • ISO‐7816 e ISO‐14443‐4 comunicación] – Unidades de datos de protocolo de aplicación de intercambio (APDUs) para aplicaciones de pago, control de acceso y identificación del gobierno.
  • Envío de comandos personales] – Enviar comandos patentados a MIFARE y otras tarjetas, siempre y cuando tenga los derechos necesarios del proveedor MIFARE/NXP.

Limitaciones notables: Core NFC no admite intercambio de datos entre pares, la emulación de tarjetas basadas en host (HCE) no está disponible en iOS (Apple Pay utiliza una ruta de elementos seguros diferente), y el controlador NFC está disponible exclusivamente para la aplicación de primer plano a menos que use la lectura de antecedentes.

Prerrequisitos del proyecto

Requisitos de hardware y software

  • Un iPhone 7 o posterior (iPhone SE, 6s, y modelos anteriores carecen de soporte de hardware NFC para Core NFC).
  • Xcode 12 o posterior (para lectura de antecedentes y soporte de escritura).
  • iOS 13+ es recomendable para las capacidades completas de escritura y fondo de NDEF, aunque la lectura sola funciona de nuevo a iOS 11.
  • Una cuenta de Apple Developer (cuentas libres pueden probar en dispositivos físicos; la distribución comercial requiere una cuenta pagada).

Habilitación del título de la NFC

En su proyecto Xcode, vaya a ]Signing & Capabilities] y agregue la capacidad de la etiqueta de comunicación de campo cercano. Esta acción añade el archivo de derecho requerido y garantiza que su aplicación puede solicitar acceso a hardware NFC.

Configuración de su aplicación para NFC

Info.plist Key

Agregue la tecla a su con una cadena que explica por qué su aplicación necesita acceso NFC. Esta cadena se presenta al usuario durante la primera sesión de NFC. Por ejemplo:

<key>NFCReaderUsageDescription</key>
<string>This app uses NFC to read your loyalty cards and event tickets.</string>

Si su aplicación escribe a etiquetas, también debe añadir la clave (iOS 13+).

Modos de fondo

Para permitir la lectura de etiquetas de fondo, active la capacidad y la verificación de los modos de referencia. Además, su aplicación debe implementar el y estar preparada para manejar la detección de etiquetas mientras esté en el fondo.

Ciclo de vida básico de la sesión de NFC

El objeto central para leer las etiquetas NDEF es . Una sesión comienza cuando usted llama y termina automáticamente cuando una etiqueta se lee (si es verdad) o cuando usted lo invalida manualmente. Durante la sesión, el sistema muestra una alerta UI proporcionada por el sistema que le dice al usuario que mantenga el dispositivo cerca de una etiqueta.

Iniciar una sesión

import CoreNFC

class NFCHandler: NSObject, NFCNDEFReaderSessionDelegate {
 private var session: NFCNDEFReaderSession?

 func beginScanning() {
 guard NFCNDEFReaderSession.readingAvailable else {
 print("NFC is not available on this device.")
 return
 }
 session = NFCNDEFReaderSession(delegate: self, queue: DispatchQueue.main, invalidateAfterFirstRead: true)
 session?.alertMessage = "Hold your iPhone near the tag."
 session?.begin()
 }
}

Manejo de los callbacks delegados

Aplicar los dos métodos de delegación necesarios:

  • – Llamado cuando uno o más mensajes de ECM se leen con éxito. El método recibe una variedad de objetos , cada uno que contiene registros.
  • – Llamado cuando la sesión termina, ya sea porque se leía una etiqueta o se cometió un error (por ejemplo, usuario cancelado, etiqueta sin soporte). Utilice este método para restablecer el estado e informar al usuario.

Ejemplo de aplicación:

func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
 for message in messages {
 for record in message.records {
 let payload = String(data: record.payload, encoding: .utf8) ?? "Unknown"
 print("NDEF Record type: \(record.typeNameFormat), payload: \(payload)")
 }
 }
}

func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
 if let readerError = error as? NFCReaderError {
 switch readerError.code {
 case .readerSessionInvalidationErrorUserCanceled:
 print("User cancelled scanning.")
 case .readerSessionInvalidationErrorSessionTimeout:
 print("Session timed out.")
 default:
 print("Session error: \(error.localizedDescription)")
 }
 }
}

Leyendo las etiquetas del ECM en la profundidad

Las etiquetas NFC suelen almacenar datos en formato NDEF. Un mensaje NDEF puede contener uno o más registros, cada uno con un tipo, identificador y carga útil. Los tipos de registro comunes incluyen (texto de la queja), (URLs), y ] (contenido rico.

Paginas de Registro de Parsing

Para interpretar la carga útil, inspeccionar los datos y :

func handleRecord(_ record: NFCNDEFPayload) {
 switch record.typeNameFormat {
 case .nfcWellKnown:
 if record.type == NFCTypeNameFormat.wellKnownTypeText {
 let textPayload = String(data: record.payload, encoding: .utf8) ?? ""
 print("Text: \(textPayload)")
 } else if record.type == NFCTypeNameFormat.wellKnownTypeURI {
 let uriPayload = String(data: record.payload, encoding: .utf8) ?? ""
 print("URI: \(uriPayload)")
 }
 case .absoluteURI:
 let absoluteURI = String(data: record.payload, encoding: .utf8) ?? ""
 print("Absolute URI: \(absoluteURI)")
 default:
 print("Unhandled type name format: \(record.typeNameFormat)")
 }
}

Escribir etiquetas de ECM

Empezando con iOS 13, puedes escribir mensajes de NDEF a etiquetas compatibles usando (o los combinados con capacidad de escritura).El proceso requiere en .

Aquí hay un ejemplo compacto usando con soporte de escritura:

func writeToTag() {
 let session = NFCNDEFReaderSession(delegate: self, queue: .main, invalidateAfterFirstRead: false)
 session.alertMessage = "Hold your iPhone near the tag to write."
 session.begin()
}

func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
 guard let tag = tags.first else { return }
 session.connect(to: tag) { error in
 guard error == nil else { return }
 // Create an NDEF message
 let payload = NFCNDEFPayload(
 format: .nfcWellKnown,
 type: NFCTypeNameFormat.wellKnownTypeURI.data(using: .utf8)!,
 identifier: Data(),
 payload: "https://example.com".data(using: .utf8)!
 )
 let message = NFCNDEFMessage(records: [payload])
 tag.queryNDEFStatus { status, _, error in
 guard status == .readWrite, error == nil else { return }
 tag.writeNDEF(message) { error in
 if error == nil {
 print("Write successful.")
 }
 session.invalidate()
 }
 }
 }
}

Nota: La escritura funciona sólo con etiquetas re-escrito (Tipo 2, Tipo 4, etc.). Algunas etiquetas (como MIFARE Classic) pueden requerir un manejo especial o pueden ser bloqueadas.

Lectura de la etiqueta de fondo

Con el modo de acceso adecuado y el modo de fondo habilitado, su aplicación puede detectar etiquetas NFC incluso cuando no está en primer plano. El sistema lanza o retoma su aplicación y entrega los datos de la etiqueta a través de los mismos métodos de delegado. Usted debe asegurarse de que su aplicación maneja la etiqueta rápidamente, ya que la sesión de antecedentes tiene tiempo limitado.

Puntos clave para la lectura de fondo:

  • Añada el modo de fondo .
  • El sistema mostrará una alerta con el nombre de su aplicación y opcionalmente el que usted estableció antes de que finalice la sesión.
  • Si la aplicación no se ejecuta en el fondo, el sistema la lanzará al fondo durante unos segundos.

Advanced NFC: ISO‐7816 y APDU Communication

Para aplicaciones que requieren comunicación directa con un elemento seguro dentro de una tarjeta (por ejemplo, terminales de pago, tarjetas de tránsito, IDs gubernamentales), use o objetos. Esto permite enviar y recibir comandos APDU según se define en la norma ISO‐7816‐4.

Ejemplo: Comunicado con una tarjeta MIFARE DESFire

func readerSession(_ session: NFCReaderSession, didDetect tags: [NFCISO7816Tag]) {
 guard let tag = tags.first else { return }
 session.connect(to: tag) { error in
 guard error == nil else { return }
 // Send SELECT command
 let selectCommand = NFCISO7816APDU(
 instructionClass: 0x00,
 instructionCode: 0xA4,
 p1Parameter: 0x04,
 p2Parameter: 0x00,
 data: Data([0xA0, 0x00, 0x00, 0x03, 0x00, 0x00]),
 expectedResponseLength: -1
 )
 tag.sendCommand(apdu: selectCommand) { response, sw1, sw2, error in
 if error == nil {
 print("Command succeeded, SW1=\(sw1), SW2=\(sw2)")
 }
 }
 }
}

El uso avanzado de etiquetas ISO‐7816 requiere una comprensión profunda del conjunto de comandos de la tarjeta de destino. La documentación de Apple Core NFC proporciona la referencia completa de API.

Consideraciones de seguridad y privacidad

NFC en iOS está diseñado con privacidad y seguridad en la vanguardia:

  • Consentimiento del usuario] – Una sesión de NFC siempre comienza con una alerta del sistema visible. El usuario debe mantener activamente el dispositivo cerca de una etiqueta; la aplicación no puede escanear silenciosamente.
  • ]Encriptación de datos] – Para operaciones sensibles (por ejemplo, pago), el controlador NFC se comunica con el elemento seguro dentro del iPhone. Los datos de la etiqueta en sí no están cifrados por el marco: su aplicación debe aplicar su propia cifrado si es necesario.
  • Etiquetar validación de contenido – Siempre validar la carga útil de las etiquetas NFC antes de utilizarla. Se podrían aprovechar los datos malformados.
  • Claves de título y plist – Apple revisa tu descripción de uso; usar mal las capacidades de NFC puede llevar a rechazo de aplicaciones.

Casos de uso real-mundial ampliados

Core NFC permite una amplia variedad de interacciones sin contacto:

  • Pagos y lealtad intrínsecos – Integrar con los terminales de pago existentes NFC o utilizar el marco para leer tarjetas de valor almacenado y puntos de fidelidad.
  • Control de acceso] – Reemplazar las claves físicas con tu aplicación iOS. Lea las credenciales de acceso a las insignias o escriba derechos de acceso temporal a las etiquetas.
  • Transporte público – Implementar funciones de tap-to-read para pases de tránsito (por ejemplo, etiquetas FeliCa en Japón; ISO‐14443 en muchos sistemas europeos).
  • Embalaje inteligente] – Permita que los usuarios toquen paquetes de productos para ver información de autenticidad, fechas de expiración o contenido promocional.
  • Puntos de información de museo y retail – Colocar etiquetas NFC junto a exposiciones o productos para ofrecer contenido multimedia rico cuando se selecciona.
  • Medical and pharmaceutical – Lee los vendajes o etiquetas de medicamentos para verificar la identidad y la dosis.

Para inspirar, véase La sesión WWDC 2020 deApple sobre NFC y el ] código de muestra Core NFC.

Optimización del rendimiento y mejores prácticas

  • Reducir la duración de la sesión – Establecer ] a la verdad cuando sólo necesita una etiqueta. Para el escaneo por lotes, administrar el ciclo de vida de la sesión cuidadosamente para evitar el drenaje de la batería.
  • Use una cola dedicada] – Pase una cola de serie al inicializador de sesión para evitar bloquear el hilo principal durante el procesamiento de etiquetas.
  • Handle NFCReaderError graciosamente] – Siempre busque errores como y proporcione mensajes claros al usuario.
  • Prueba con etiquetas reales – El simulador no admite NFC. Usa una variedad de etiquetas físicas (Tipo 2, Tipo 4, MIFARE) para garantizar la compatibilidad.
  • Evitar los lazos de votación – Una vez detectada una etiqueta, procesarla inmediatamente y terminar la sesión. El escaneo repetido de la misma etiqueta es innecesario.

Problemas comunes

ProblemSolution
NFCNDEFReaderSession.readingAvailable returns falseEnsure the device is iPhone 7 or later. Check that the NFC capability is enabled in Xcode and the entitlement file is present.
Session starts but no tag is detectedMake sure the tag is NDEF‑formatted and placed correctly near the top‑back of the iPhone (near the camera). Some thick cases can interfere.
App rejected due to missing usage descriptionAdd both NFCReaderUsageDescription and (if writing) NFCWriteAccessUsageDescription to Info.plist.
Background reading not triggeringEnable the “Near Field Communication Tag Reading” background mode. Also ensure the app was terminated properly (not force‑killed).
Writing fails with “tag not writable”Check if the tag is locked or read‑only. Some tags require a password before writing.

El futuro de NFC en iOS

Apple sigue evolucionando NFC Core con cada lanzamiento de iOS. Las capacidades desbordadas y emergentes incluyen un soporte ampliado para ISO-15693 (utilizado en libros de bibliotecas y algunas etiquetas de inventario), mejoras potenciales de rango de lectura, e integración más profunda con Wallet y Express Mode. Los desarrolladores deben monitorear las Core NFC Notas de liberación] para mantenerse actualizados.

Conclusión

El marco de iOS Core NFC es una herramienta robusta y bien diseñada para agregar intercambio de datos sin contacto a cualquier aplicación de iPhone. Al dominar su ciclo de vida de sesión, manejo de NDEF y comunicación de etiquetas avanzada, puede ofrecer todo desde el simple escaneado de tarjetas de visita a sistemas de control de acceso sofisticados. Comience por construir un lector mínimo, luego expanda con capacidades de escritura y de fondo como su caso de uso.