Table of Contents
Comprendre le cadre de base de la NFC pour l'échange de données sans contact
Le cadre NFC de base iOS permet aux développeurs de construire des applications qui lisent et écrivent des étiquettes de communication en champ proche (NFC), permettant un échange de données rapide, sécurisé et direct sans contact. La technologie NFC devient un élément essentiel dans le commerce de détail, le transport, le contrôle d'accès et bien plus encore, la compréhension de l'intégration de ce cadre dans votre application iOS ouvre la porte à des expériences utilisateur modernes et sans friction.
Un bref aperçu de NFC sur iOS
Apple a introduit le cadre NFC Core avec iOS 11, initialement limité à la lecture des balises NFC Data Exchange Format (NDEF). Les versions iOS suivantes ont élargi les capacités : iOS 13 a ajouté une prise en charge pour l'écriture des balises NDEF et de la lecture des étiquettes de fond, tandis qu'iOS 14 et plus tard ont amélioré la compatibilité avec les balises ISO‐7816, ISO‐15693 et FeliCa. Aujourd'hui, Core NFC est disponible sur iPhone 7 et plus tard, atteignant des millions d'utilisateurs.
NFC opère sur une distance de quelques centimètres, ce qui le rend idéal pour des scénarios -tap-to-interact -comme le paiement, la fidélité, la billetterie et la vérification d'identité. Le cadre résume la communication radio de bas niveau, laissant les développeurs se concentrer sur l'analyse et le traitement des données reçues des balises NFC.
Capacités du cadre de base des NFC
Il est essentiel de comprendre ce que le cadre de base de la CCN peut (et ne peut pas) faire avant de commencer à élaborer.
- NDEF tag reading – Lisez les messages NDEF à partir des balises compatibles NFC (ISO 14443, FeliCa et ISO 15693 dans les versions iOS ultérieures).
- ] – Écrivez des messages NDEF pour réinscriptible tags (iOS 13+).
- Relecture des balises de fond – Détectez et lisez les balises NFC même lorsque votre application est en arrière-plan (iOS 13+).
- Communication ISO‐7816 et ISO‐14443‐4 – Échanger des unités de données du protocole d'application (UDAP) pour les applications de paiement, de contrôle d'accès et d'identification gouvernementale.
- Envoyer des commandes personnalisées – Envoyer des commandes propriétaires à MIFARE et à d'autres cartes, à condition que vous ayez les droits nécessaires du fournisseur MIFARE/NXP.
Limites notables : La NFC de base ne supporte pas l'échange de données entre pairs, l'émulation de cartes par hôte (HCE) n'est pas disponible sur iOS (Apple Pay utilise un chemin d'élément sécurisé différent), et le contrôleur de la NFC est exclusivement disponible pour l'application de premier plan à moins d'utiliser la lecture de fond.
Prérequis du projet
Exigences relatives au matériel et au logiciel
- Un iPhone 7 ou plus (iPhone SE, 6s, et modèles précédents ne disposent pas de la prise en charge matérielle NFC pour le Core NFC).
- Xcode 12 ou plus (pour la lecture de fond et le support d'écriture).
- iOS 13+ est recommandé pour les capacités complètes d'écriture et de fond NDEF, bien que la lecture seule fonctionne à nouveau sur iOS 11.
- Un compte Apple Developer (les comptes libres peuvent être testés sur des appareils physiques; la distribution commerciale nécessite un compte payant).
Permettre le versement du titre de base de la NFC
Dans votre projet Xcode, accédez à Signing & Capacities et ajoutez la fonction Nuit de communication sur le champ proche de la lecture d'étiquette[. Cette action ajoute le fichier de droits requis et garantit que votre application peut demander l'accès au matériel NFC.
Configuration de votre application pour NFC
Info.plist Clé
Ajoutez la touche à votre avec une chaîne expliquant pourquoi votre application a besoin d'un accès NFC. Cette chaîne est présentée à l'utilisateur lors de la première session NFC. Par exemple :
<key>NFCReaderUsageDescription</key>
<string>This app uses NFC to read your loyalty cards and event tickets.</string>
Si votre application écrit sur les balises, vous devez également ajouter la touche (iOS 13+).
Modes de fond
Pour activer la lecture des étiquettes de fond, activez la fonctionnalité Modes de fond et vérifiez Communication de champ proche Lecture des étiquettes[. De plus, votre application doit implémenter le et être prête à gérer la détection des étiquettes de fond.
Cycle de vie des sessions de base de la NFC
L'objet central pour la lecture des balises NDEF est . Une session commence lorsque vous appelez et se termine automatiquement lorsqu'une balise est lue (si est vraie) ou lorsque vous l'invalidez manuellement. Pendant la session, le système affiche une alerte d'interface utilisateur fournie par le système indiquant à l'utilisateur de tenir l'appareil près d'une balise.
Début d'une session
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()
}
}
Traitement des rappels des délégués
Mettre en œuvre les deux méthodes de délégation requises :
- – Appelé quand un ou plusieurs messages NDEF sont lus avec succès. La méthode reçoit un tableau d'objets , chacun contenant des enregistrements.
- – Appelé à la fin de la session, soit parce qu'une balise a été lue, soit parce qu'une erreur s'est produite (p. ex., une balise non prise en charge, annulée par l'utilisateur).
Exemple de mise en œuvre :
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)")
}
}
}
Lecture des étiquettes NDEF en profondeur
Les étiquettes NFC stockent généralement les données au format NDEF. Un message NDEF peut contenir un ou plusieurs enregistrements, chacun avec un type, un identifiant et une charge utile. Les types d'enregistrement courants comprennent (texte simple), (URL) et (contenu riche).
Charges utiles de l'analyse des dossiers
Pour interpréter la charge utile, consultez les données et :
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)")
}
}
Écrire des étiquettes NDEF
À partir d'iOS 13, vous pouvez écrire des messages NDEF sur des balises compatibles en utilisant (ou le combiné avec la capacité d'écriture). Le processus nécessite dans .
Voici un exemple compact utilisant avec support d'écriture:
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()
}
}
}
}
Remarque : L'écriture ne fonctionne qu'avec des étiquettes réinscriptibles (type 2, type 4, etc.). Certaines étiquettes (comme MIFARE Classic) peuvent nécessiter une manipulation spéciale ou être verrouillées.
Lecture de l'étiquette de fond
Avec le mode de droit et de fond approprié activé, votre application peut détecter les balises NFC même si elles ne sont pas au premier plan. Le système lance ou reprend votre application et livre les données de la balise via les mêmes méthodes de délégation. Vous devez vous assurer que votre application gère rapidement la balise, car la session de fond a un temps limité.
Points clés pour la lecture des faits:
- Ajouter le mode de fond de la communication en champ proche.
- Le système affichera une alerte avec votre nom d'application et en option le que vous avez défini avant la fin de la session.
- Si l'application ne fonctionne pas en arrière-plan, le système le lancera en arrière-plan pendant quelques secondes.
NFC avancé: ISO‐7816 et APDU Communication
Pour les applications nécessitant une communication directe avec un élément sécurisé à l'intérieur d'une carte (p. ex. terminaux de paiement, cartes de transit, ID gouvernementaux), utilisez ou des objets. Cela permet d'envoyer et de recevoir des commandes APDU telles que définies dans la norme ISO‐7816‐4.
Exemple : Communiquer avec une carte 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'utilisation avancée des balises ISO‐7816 nécessite une compréhension approfondie de la commande card cible. Apples La documentation NFC de base fournit la référence complète de l'API.
Considérations relatives à la sécurité et à la protection des renseignements personnels
NFC sur iOS est conçu avec la confidentialité et la sécurité à l'avant-garde:
- Consentement de l'utilisateur[ – Une session NFC commence toujours par une alerte système visible. L'utilisateur doit tenir activement l'appareil près d'une balise; l'application ne peut pas scanner silencieusement.
- Cryptage des données[ – Pour les opérations sensibles (p. ex. paiement), le contrôleur NFC communique avec l'élément sécurisé à l'intérieur de l'iPhone. Les données de la balise elle-même ne sont pas chiffrées par le cadre – votre application doit appliquer son propre chiffrement si nécessaire.
- Validation du contenu du tag[ – Validez toujours la charge utile à partir des étiquettes NFC avant de l'utiliser.
- Entretien et touches de liste – Apple examine votre description d'utilisation; une mauvaise utilisation des capacités NFC peut conduire au rejet de l'application.
Cas d'utilisations réelles dans le monde élargis
La NFC de base permet une grande variété d'interactions sans contact:
- Paiements et fidélité sans contact[ – Intégrez-vous aux terminaux de paiement existants équipés de NFC ou utilisez le cadre pour lire les cartes et les points de fidélité.
- Contrôle d'accès[ – Remplacer les clés physiques par votre application iOS. Lire les identifiants depuis les badges d'accès ou écrire des droits d'accès temporaires aux balises.
- Transports publics – Mettre en œuvre des fonctions de lecture à la carte pour les laissez-passer de transit (p. ex., étiquettes FeliCa au Japon; ISO-14443 dans de nombreux systèmes européens).
- Emballage intelligent – Laissez les utilisateurs saisir des paquets de produits pour voir les informations d'authenticité, les dates d'expiration ou le contenu promotionnel.
- – Placez des étiquettes NFC à côté des expositions ou des produits pour fournir du contenu multimédia riche lorsqu'ils sont tapés.
- Médecine et pharmaceutique – Lisez les bracelets ou étiquettes de médicaments du patient pour vérifier l'identité et la posologie.
Pour plus d'inspiration, voir Apple WWDC 2020 session sur NFC et le code d'échantillon officiel de base NFC[.
Optimisation du rendement et pratiques exemplaires
- Réduisez la durée de la session – Définissez à vrai lorsque vous n'avez besoin que d'une seule étiquette.
- Utilisez une file d'attente dédiée – Passez une file d'attente série à l'initialisateur de session pour éviter de bloquer le thread principal pendant le traitement des étiquettes.
- Handle NFCReaderError gracieusement – Vérifiez toujours les erreurs comme et fournissez des messages clairs à l'utilisateur.
- Test avec des balises réelles – Le simulateur ne supporte pas NFC. Utilisez une variété de balises physiques (Type 2, Type 4, MIFARE) pour assurer la compatibilité.
- Éviter les boucles de vote – Une fois qu'une balise est détectée, la traiter immédiatement et terminer la session.
Dépannage de problèmes communs
| Problem | Solution |
|---|---|
NFCNDEFReaderSession.readingAvailable returns false | Ensure 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 detected | Make 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 description | Add both NFCReaderUsageDescription and (if writing) NFCWriteAccessUsageDescription to Info.plist. |
| Background reading not triggering | Enable 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. |
L'avenir de la NFC sur iOS
Apple continue d'évoluer avec la NFC Core avec chaque version iOS. Les capacités émergentes et randomisées comprennent le support élargi pour ISO-15693 (utilisé dans les livres de bibliothèque et certaines étiquettes d'inventaire), des améliorations potentielles de la gamme de lecture et une intégration plus approfondie avec Wallet et Express Mode.
Conclusion
Le cadre NFC de base iOS est un outil robuste et bien conçu pour ajouter l'échange de données sans contact à n'importe quelle application iPhone. En maîtrisant son cycle de vie de session, la gestion NDEF et la communication avancée des étiquettes, vous pouvez tout livrer de simples analyses de cartes d'affaires à des systèmes de contrôle d'accès sophistiqués. Commencez par construire un lecteur minimal, puis développez avec des capacités d'écriture et de fond comme votre cas d'utilisation le demande.