Comprendere il framework NFC per lo scambio di dati senza contatto

Il framework iOS Core NFC offre agli sviluppatori la possibilità di creare applicazioni che leggono e scrivano tag Near Field Communication (NFC), consentendo uno scambio rapido, sicuro e diretto di dati contactless. Poiché la tecnologia NFC diventa un punto di forza nel retail, nel trasporto, nel controllo degli accessi e molto altro, capire come integrare questo framework nella tua app iOS apre la porta alle esperienze di utente moderne e senza attriti.

Una breve panoramica di NFC su iOS

Near Field Communication (NFC) è uno standard di connettività wireless a corto raggio che opera a 13.56 MHz. Apple ha introdotto il framework Core NFC con iOS 11, originariamente limitato alla lettura dei tag NFC Data Exchange Format (NDEF).

NFC opera su una distanza di pochi centimetri, rendendolo ideale per scenari “tap-to-interact” come il pagamento, la lealtà, la bigliettazione e la verifica dell’identità. Il framework astratti la comunicazione radio di basso livello, permettendo agli sviluppatori di focalizzarsi sulla parsing e sulla gestione dei dati ricevuti dai tag NFC.

Capacità quadro NFC core

La comprensione di ciò che il quadro NFC core può (e non può) fare è essenziale prima di iniziare lo sviluppo.

  • NDEF tag reading[[] – Leggi i messaggi NDEF da tag NFC compatibili (ISO 14443, FeliCa, e ISO 15693 nelle versioni successive iOS).
  • NDEF tag write[[] – Scrivere messaggi NDEF per tag riscrivibili (iOS 13+).
  • Rileva e leggi le tag NFC anche quando la tua app è sullo sfondo (iOS 13+).
  • ISO‐7816 e ISO‐14443‐4 comunicazione[[[] – Unità di dati del protocollo di applicazione di scambio (APDU) per applicazioni di pagamento, controllo degli accessi e ID governativo.
  • Comando personalizzato[] – Invia comandi proprietari a MIFARE e altre carte, a condizione che tu abbia i diritti necessari dal provider MIFARE/NXP.

Limitazioni notevoli: Core NFC non supporta lo scambio di dati peer-to-peer, l'emulazione di schede host-based (HCE) non è disponibile su iOS (Apple Pay utilizza un percorso di elementi sicuri diversi), e il controller NFC è disponibile esclusivamente all'app di primo piano a meno che non si utilizzi la lettura di sfondo.

Prerequisiti del progetto

Requisiti hardware e software

  • Un iPhone 7 o successivo (iPhone SE, 6s, e modelli precedenti non hanno supporto hardware NFC per Core NFC).
  • Xcode 12 o versioni successive (per la lettura e il supporto per la scrittura di sfondo).
  • iOS 13+ è consigliato per le funzionalità complete di scrittura e di sfondo NDEF, anche se la lettura da sola funziona di nuovo a iOS 11.
  • Un account Apple Developer (le account gratuiti possono essere testati su dispositivi fisici; la distribuzione commerciale richiede un account pagato).

Attivazione del core NFC

Nel vostro progetto Xcode, navigate a []Signing & Capabilities[] e aggiungete la []Near Field Communication Tag Reading] funzionalità.

Configurazione della tua App per NFC

Info.plist Key

Aggiungi il tasto al tuo []] con una stringa che spiega perché la tua applicazione ha bisogno di accesso NFC. Questa stringa viene presentata all'utente durante la prima sessione NFC.

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

Se la tua app scrive a tag, devi aggiungere anche il tasto (iOS 13+).

Modalità di sfondo

Per abilitare la lettura di etichette di sfondo, abilitare la [] Modalità di sfondo] capacità e controllare []]Near Field Communication Tag Reading[]]]. Inoltre, la tua app deve implementare il ] ed essere pronto a gestire il rilevamento dei tag mentre si trova in background.

ciclo di vita della sessione NFC

L'oggetto centrale per la lettura dei tag NDEF è . Una sessione inizia quando si chiama [] e termina automaticamente quando viene letto un tag (se è vero) o quando si invalida manualmente. Durante la sessione, il sistema mostra un avviso UI fornito dal sistema che dice all'utente di tenere il dispositivo vicino a un tag.

Avvio di una sessione

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()
 }
}

Gestione dei Callback Delegato

Implementare i due metodi del delegato richiesti:

  • – Chiamato quando vengono letti con successo uno o più messaggi NDEF, il metodo riceve una serie di oggetti , ciascuno contenente i record.
  • – Chiamato quando la sessione termina, sia perché è stato letto un tag o si è verificato un errore (ad esempio, l'utente ha cancellato, tag non supportato).

Esempio di attuazione:

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)")
 }
 }
}

Lettura NDEF Tags in profondità

I tag NFC memorizzano in genere i dati in formato NDEF. Un messaggio NDEF può contenere uno o più record, ciascuno con un tipo, un identificatore e un payload. I tipi di record comuni includono (testo principale), ] (URLs), e (contenuto ricco).

Pagamenti di record di Parsing

Per interpretare il carico utile, ispezionare i dati e :

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)")
 }
}

Scrivere NDEF Tags

A partire da iOS 13, è possibile scrivere messaggi NDEF a tag compatibili utilizzando [] (o il combinato [ con capacità di scrittura). Il processo richiede in .

Ecco un esempio compatto che utilizza ] con supporto di scrittura:

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 scrittura funziona solo con tag riscrivibili (Tipo 2, Tipo 4, ecc.). Alcuni tag (come MIFARE Classic) possono richiedere una gestione speciale o possono essere bloccati.

Indietro Tag lettura

Con l'apposita modalità di diritto e di sfondo abilitata, la tua app può rilevare tag NFC anche quando non è in primo piano. Il sistema lancia o riprende la tua app e fornisce i dati del tag attraverso gli stessi metodi delegata.

Punti chiave per la lettura di sfondo:

  • Aggiungi la modalità di sfondo Near Field Communication Tag Reading[.
  • Il sistema mostrerà un avviso con il nome della tua app e, in modo facoltativo, il che hai impostato prima della sessione terminata.
  • Se l'applicazione non è in esecuzione in background, il sistema lo lancerà in background per alcuni secondi.

NFC avanzato: ISO‐7816 e comunicazione APDU

Per applicazioni che richiedono una comunicazione diretta con un elemento sicuro all'interno di una scheda (ad esempio, terminali di pagamento, carte di transito, ID di governo), utilizzare [ o [ oggetti.

Esempio: comunicare con una scheda 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)")
 }
 }
 }
}

L’utilizzo avanzato dei tag ISO‐7816 richiede una profonda comprensione del set di comando della scheda di destinazione. La documentazione NFC Core [] fornisce il riferimento API completo.

Considerazioni sulla sicurezza e sulla privacy

NFC su iOS è stato progettato con privacy e sicurezza in prima linea:

  • Consenso utente[[] – Una sessione NFC inizia sempre con un avviso di sistema visibile. L'utente deve tenere attivamente il dispositivo vicino a un tag; l'applicazione non può scansionare silenziosamente.
  • Data crittografia[] – Per operazioni sensibili (ad esempio, pagamento), il controller NFC comunica con l'elemento sicuro all'interno dell'iPhone. I dati del tag stesso non sono crittografati dal framework – la tua app deve applicare la propria crittografia se necessario.
  • Tag content validation[[] – convalidare sempre il carico di pagamento da tag NFC prima di utilizzarlo.
  • I tasti di istruzioni e di lista[[[] – Apple esamina la descrizione dell'utilizzo; le funzionalità di NFC che non utilizzano possono portare al rifiuto dell'app.

Casi di utilizzo reali espansi

Core NFC consente un'ampia gamma di interazioni senza contatto:

  • Pagamenti e lealtà senza contatto[[] – Integrare con i terminali di pagamento NFC già equipaggiati o utilizzare il framework per leggere carte di valore memorizzate e punti di fedeltà.
  • Controllo dell'accesso[[] – Sostituisci i tasti fisici con la tua app iOS. Leggi le credenziali dai badge di accesso o scrivi i diritti di accesso temporanei ai tag.
  • Trasporti pubblici[[] – Attuazione delle funzioni di tap-to-read per i passaggi di transito (ad esempio, tag FeliCa in Giappone; ISO‐14443 in molti sistemi europei).
  • Imballo intelligente[[] – Lasciare che gli utenti toccano i pacchetti di prodotti per visualizzare informazioni sull'autenticità, date di scadenza o contenuti promozionali.
  • Punti di informazioni sul consumo e sul dettaglio[[] – Posizionare tag NFC vicino a mostre o prodotti per fornire contenuti multimediali ricchi quando si è intercettato.
  • Medical e farmaceutico[[] – Leggi le fasce di polso del paziente o le etichette dei farmaci per verificare l'identità e il dosaggio.

Per ispirarsi, vedere La sessione di Apple WWDC 2020 su NFC[] e il ufficiale codice campione NFC[[.

Ottimizzazione delle prestazioni e migliori pratiche

  • Ridurre la durata della sessione[[] – Impostare ] per essere vero quando hai bisogno di un solo tag. Per la scansione in batch, gestire il ciclo di vita di sessione con attenzione per evitare di drenare la batteria.
  • Utilizza una coda dedicata[[] – Passare una coda seriale all'iniziale sessione per evitare di bloccare il file principale durante l'elaborazione dei tag.
  • Handle NFCReaderError con grazia[ – Controllare sempre gli errori come ] e fornire messaggi chiari all'utente.
  • Test con tag reali[[] – Il simulatore non supporta NFC. Utilizzare una varietà di tag fisici (Tipo 2, Tipo 4, MIFARE) per garantire la compatibilità.
  • Avoid polling loops[ – Una volta che viene rilevato un tag, processarlo immediatamente e terminare la sessione.

Risoluzione dei problemi Problemi comuni

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.

Il futuro della NFC su iOS

Le funzionalità di Rumored e di emergenze includono un supporto esteso per ISO‐15693 (utilizzato nei libri di libreria e in alcuni tag di inventario), potenziali miglioramenti di lettura e integrazione più profonda con Wallet e Express Mode. Gli sviluppatori dovrebbero monitorare le note di rilascio Core NFC]] per rimanere attuali.

Conclusioni

Grazie alla sua gestione del ciclo di vita di sessione, alla gestione NDEF e alla comunicazione avanzata dei tag, puoi fornire tutto, dalla semplice scansione delle schede aziendali ai sofisticati sistemi di controllo accessi. Inizia costruendo un lettore minimale, quindi espandersi con le funzionalità di scrittura e di sfondo come il caso di utilizzo richiede. Con milioni di iPhone equipaggiati in campo, l'opportunità di creare esperienze senza soluzione di continuità.