Session NDEF ou session de tag : laquelle ouvrir sur iOS ?
La session NDEF quand le tag porte un message et que le travail de l'application est ce message. La session de tag quand l'application a besoin de la puce elle même, un identifiant, un compteur, un mot de passe, un bloc de mémoire hors NDEF : elle détecte par technologie radio, et elle se paie en déclarations.
Ce que fait une session NDEF
Core NFC lit les données NDEF des tags de types 1 à 5, selon la présentation du cadre par Apple, et NFCNDEFReaderSession est la session faite pour cela. Elle remet chaque message à son délégué par readerSession(_:didDetectNDEFs:), sans objet tag et sans commande.
Depuis iOS 13, la même session peut aussi remettre les tags eux mêmes. Un délégué qui implémente readerSession(_:didDetect:) reçoit des objets NFCNDEFTag, se connecte à l'un d'eux, et peut l'interroger, l'écrire et le verrouiller, comme le décrit la page de l'écriture.
Le drapeau invalidateAfterFirstRead décide de la durée de vie de la session. À vrai, elle se termine après la première lecture réussie ; à faux, elle continue de lire jusqu'à l'expiration ou l'annulation. La note d'Apple sur l'initialiseur demande de le mettre à faux pour une session qui écrit.
Ce qu'ajoute une session de tag
NFCTagReaderSession, disponible depuis iOS 13, détecte les tags par technologie radio plutôt que par contenu. Ses options d'interrogation choisissent ce qu'elle cherche : iso14443 pour les tags compatibles ISO 7816 et MIFARE, iso15693 pour les cartes de voisinage, iso18092 pour FeliCa, et depuis iOS 16 une option pace.
Chaque tag détecté arrive comme une valeur NFCTag dont le cas donne le protocole : NFCISO7816Tag pour les APDU, NFCISO15693Tag pour les commandes de bloc, NFCFeliCaTag, ou NFCMiFareTag pour les commandes MIFARE. Chacun se conforme aussi à NFCNDEFTag : une session de tag lit et écrit donc du NDEF elle aussi.
Le prix est dans les déclarations. En plus du droit d'accès et du texte d'usage dont toute application Core NFC a besoin, la documentation de la classe ne remet un tag ISO 7816 que pour les identifiants d'application listés dans Info.plist, comme l'explique la page des déclarations.
Une session à la fois
Une seule session de lecture, de quelque type que ce soit, est active dans le système à la fois, indique la documentation de la classe de base, et les sessions supplémentaires attendent dans une file servie dans l'ordre. Une application qui en démarre une seconde pendant que la première est ouverte attend la fin de la première.
Une session a aussi besoin du matériel. readingAvailable répond avant toute création, et Apple demande aux applications de le vérifier d'abord ; Core NFC n'est pas disponible du tout dans les extensions d'application.
Et une session se termine définitivement. Une fois invalidée, elle ne peut plus scanner, et l'application en crée une nouvelle, ce que fait l'exemple de lecteur de tags d'Apple après chaque invalidation.
Choisir entre les deux
| Question | Session NDEF | Session de tag |
|---|---|---|
| Disponible depuis | iOS 11 en lecture, iOS 13 en écriture | iOS 13 |
| Ce qu'elle remet | Des messages, ou des tags NDEF par didDetect | Des tags par protocole, tous capables de NDEF |
| Commandes vers la puce | Aucune | APDU, blocs ISO 15693, commandes FeliCa et MIFARE |
| Déclarations supplémentaires | Aucune | Identifiants d'application pour ISO 7816, codes système pour FeliCa |
Choisissez la session NDEF quand le tag porte un message et que le travail de l'application est ce message. Choisissez la session de tag quand l'application a besoin de la puce : un identifiant, un compteur, un mot de passe, un bloc de mémoire hors NDEF.
Questions fréquentes
Une application iOS peut-elle lire un tag sans la feuille de lecture ?
Non. Une session de lecture affiche l'alerte système de scan pendant qu'elle tourne, et l'application n'en choisit que le message, par alertMessage.
Une session de tag lit-elle aussi le NDEF ?
Oui. Tous les types de tag qu'elle remet se conforment aussi à NFCNDEFTag, donc l'application peut lire et écrire du NDEF après connexion.
Deux sessions peuvent-elles tourner en même temps ?
Non. Une seule session de lecture, de quelque type que ce soit, est active dans le système, et les autres attendent dans une file servie dans l'ordre.
Pourquoi ma session NDEF se termine-t-elle après le premier tag ?
invalidateAfterFirstRead est à vrai, et le délégué reçoit readerSessionInvalidationErrorFirstNDEFTagRead à la fin de la session. Mettez-le à faux pour continuer de lire ou pour écrire.