¿Qué hace core-nfc?
Lee y escribe etiquetas NFC usando CoreNFC. Útil para escanear etiquetas NDEF, leer etiquetas ISO7816/ISO15693/FeliCa/MIFARE, escribir mensajes NDEF, manejar el ciclo de vida de sesiones NFC, configurar permisos NFC o implementar lectura de etiquetas en segundo plano en apps iOS.
Descripción general
Este skill permite a un agente de IA interactuar con el framework CoreNFC de Apple para leer y escribir etiquetas NFC en dispositivos iOS compatibles. Proporciona una interfaz unificada para manejar sesiones NFC, procesar mensajes NDEF y comunicarse con diferentes tecnologías de etiquetas.
Plataformas compatibles
- iOS 11+ (lectura NDEF básica)
- iOS 13+ (lectura de etiquetas avanzadas: ISO7816, ISO15693, FeliCa, MIFARE)
- iOS 14+ (escritura de etiquetas NDEF)
- iOS 15+ (lectura en segundo plano)
Requisitos
- Dispositivo iPhone con chip NFC (iPhone 7 o superior)
- Entitlement
com.apple.developer.nfc.readersession.formatsen Xcode - Capacidad NFC activada en el proyecto
- Para escritura: entitlement
com.apple.developer.nfc.readersession.writing
Funcionalidades principales
1. Iniciar sesión de lectura NDEF
import CoreNFC
let session = NFCNDEFReaderSession(delegate: self, queue: DispatchQueue.main, invalidateAfterFirstRead: false)
session.begin()
2. Leer un mensaje NDEF
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
for message in messages {
for record in message.records {
print("TNF: \(record.typeNameFormat)")
print("Tipo: \(record.type)")
print("Identificador: \(record.identifier)")
print("Contenido: \(record.payload)")
}
}
}
3. Escribir un mensaje NDEF
let textRecord = NFCNDEFPayload.wellKnownTypeTextPayload(string: "Hola Mundo", locale: Locale.current)!
let uriRecord = NFCNDEFPayload.wellKnownTypeURIPayload(string: "https://ejemplo.com")!
let message = NFCNDEFMessage(records: [textRecord, uriRecord])
let session = NFCNDEFReaderSession(delegate: self, queue: DispatchQueue.main, invalidateAfterFirstRead: false)
session.connect(to: tag) { error in
guard error == nil else { return }
session.writeNDEF(message) { error in
if error == nil {
print("Escritura exitosa")
}
}
}
4. Leer etiquetas avanzadas (ISO15693, FeliCa, etc.)
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
if case let .iso15693(tag) = tags.first! {
session.connect(to: tags.first!) { error in
tag.readSingleBlock(requestFlags: [.highDataRate, .address], blockNumber: 0) { data, error in
// Procesar datos
}
}
}
}
5. Manejo del ciclo de vida de la sesión
// Iniciar sesión
session.begin()
// Invalidar sesión con mensaje
session.invalidate(errorMessage: "Lectura cancelada")
// Reiniciar sesión (si se necesita)
session.restartPolling()
6. Configuración de entitlements
En el archivo Info.plist:
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>TAG</string>
<string>NDEF</string>
</array>
<key>com.apple.developer.nfc.readersession.writing</key>
<true/>
Consideraciones importantes
- Las sesiones NFC requieren interacción del usuario (la interfaz de escaneo aparece automáticamente)
- La lectura en segundo plano solo está disponible en iOS 15+
- Las operaciones de escritura requieren que la etiqueta esté en modo de escritura
- Los mensajes NDEF tienen un límite de tamaño (normalmente ~8 KB para etiquetas NTAG)
Ejemplo de uso completo
import UIKit
import CoreNFC
class ViewController: UIViewController, NFCNDEFReaderSessionDelegate {
func scanButtonTapped() {
let session = NFCNDEFReaderSession(delegate: self, queue: DispatchQueue.main, invalidateAfterFirstRead: false)
session.alertMessage = "Acerca tu iPhone a la etiqueta NFC"
session.begin()
}
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
for message in messages {
for record in message.records {
if let text = String(data: record.payload, encoding: .utf8) {
print("Texto leído: \(text)")
}
}
}
}
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
print("Error de sesión: \(error.localizedDescription)")
}
}