NFC / norme NDEF et ce que l’on peut faire dans une app iOS

Par :
Matthieu Ambrois

lun, 13/11/2017 - 11:57

Avec la sortie d’iOS 11, Apple a décidé de permettre aux développeurs d'applications d'accéder au sein de leurs apps à la lecture des tags NFC. Uniquement la norme NDEF, uniquement pour les iPhone 7 et 7 Plus, et sans écriture possible.

Nb : nous partons du principe que vous savez ce qu'est la technologie NFC dans cet article.

Pourquoi pas sur des modèles d'iPhone antérieurs ? L'iPhone 6 a pourtant une puce NFC !

La puce actuellement en place sur l'iPhone 6 est : NXP 65V10
iPhone 6S/SE : NXP 66V10
iPhone 7 / Apple Watch Serie 2 : NXP 67V04

On peut uniquement se douter que la dernière puce en place sur les iPhone 7 a quelque chose que les autres n'ont pas. On peut aussi se demander si, à tout hasard, ce ne serait pas l'occasion de changer d'iPhone pour bénéficier d'applications intégrant de la lecture de tag NFC ?

Au passage, on remarquera que c'est NXP (ex Philips) qui fabrique ces puces, NXP étant un des co-fondateurs du consortium NFC Forum.

Pourquoi n'y a-t-il pas d'écriture disponible dans les apps iOS ?

Au quotidien un utilisateur d'iPhone ne cherche pas à écrire un tag NFC. Ce sont plutôt les développeurs ou les fournisseurs de tags NFC qui écriront des tags NFC. Apple n'a probablement encore pas jugé cela utile.

C'est quoi NDEF ?

NDEF signifie, en anglais, NFC Data Exchange Format.

C'est une norme de standardisation des échanges entre 2 devices NFC, 1 device et 1 tag, …

Pour plus de détails techniques, vous pouvez consulter les spécifications techniques NDEF.

Il faut garder en tête qu'un tag NDEF peut contenir 1 ou plusieurs messages, selon le schéma ci-dessous dont nous retrouverons les acronymes :

  • Un message NDEF contient un ou plusieurs enregistrements
  • Chaque enregistrement contient un entête "header" et un payload
  • Chaque entête contient un identifiant "identifier", une longueur "length", et un type.

On peut faire quoi dans une app iOS alors ?

Regardons de plus près les méthodes mises à disposition pour l'instant par Apple, iOS 11 n'ayant pas encore de release publique non Beta. Il s'agit du framework "Core NFC".

Pour commencer, et afin que votre application ne soit pas refusée par Apple, comme pour les notifications push ou la géolocalisation, il faudra personnaliser votre fiche Info.plist avec un message expliquant à l'utilisateur la/les raison(s) pour lesquelles il devra accepter le NFC dans votre app. La clé se nomme "NFCReaderUsageDescription"

Il faudra aussi prendre en compte que vous ne pouvez pas (pour le moment) simuler NFC dans le simulateur. Peut-être cela sera-t-il disponible sur certains Mac Book Pro incluant une puce NFC ?

La capacité "NFC Tag Reading" doit être activé sur votre projet XCode (via XCode ou via Apple Developer Center)

Ensuite, dans votre fichier .entitlements de votre projet (XCode beta 6 le fait automatiquement) :

<key>com.apple.developer.nfc.readersession.formats</key>
<array>
   <string>NDEF</string>
</array>

Nous sommes prêts pour commencer notre lecteur NFC dans notre app iOS !

Quelques précisions sur NDEF et les méthodes CoreNFC mises à notre disposition.

Pour utiliser des tags NFC, il est important de bien comprendre la norme NDEF. Quand CoreNFC détecte un nouveau tag dans votre app, la méthode déléguée didDetectNDEFs retourne un tableau des messages NDEF "NFCNDEFMessage". En général, un seul message sera contenu dans le tableau.

Que contient un message NDEF : un tableau de payload des enregistrements "NFCNDEFPayload". C'est-ce qui va nous intéresser. Dans un payload, nous avons 4 attributs :

  • identifier :

C'est l'identifiant unique de l'enregistrement.

  • payload :

C'est le payload de l'enregistrement. On peut y accéder en fonction du typeNameFormat défini ci-dessous.

  • type :

Il s'agit du Record Type Definition (RTD) de l'enregistrement. C'est un NSData (Data en Swift). Il en existe plusieurs mais ne sont pas (encore ?) documentés par Apple, tels que URI, Text, Verb, … Vous pouvez regarder les spécifications RTD pour en savoir plus, ou ceux déjà mis en place dans la documentation Android.

  • typeNameFormat :

Appelé aussi TNF, 7 sont actuellement disponibles :

  • NFCTypeNameFormatAbsoluteURI

On trouvera dans l'enregistrement une ressource de type URI absolue.

  • NFCTypeNameFormatEmpty

Il n'y aura rien dans l'enregistrement.

  • NFCTypeNameFormatMedia

L'enregistrement contiendra un media (ou juste une partie) défini par un type MIME (RFC 2046)

  • NFCTypeNameFormatNFCExternal

L'enregistrement est défini par un RTD (voir "Type" ci-dessus) externe, non standard, utilisé par une société pour ses propres besoins.

  • NFCTypeNameFormatNFCWellKnown

A contrario, l'enregistrement est défini par un RTD connu.

  • NFCTypeNameFormatUnchanged

Utile lorsque l'enregistrement n'est pas le seul enregistrement mais un enregistrement intermédiaire ou bien le dernier. Cela arrive quand votre enregistrement est trop grand et nécessite d'utiliser un ou plusieurs autres enregistrements.

  • NFCTypeNameFormatUnknown

Le type de données est inconnu 

C'est parti pour le développement !

C'est très simple, 3 points essentiels sont nécessaires :

  • Implémenter NFCNDEFReaderSessionDelegate dans votre classe
  • Créer une nouvelle instance de NFCNDEFReaderSession qui prendra en paramètre le delegate du point précédent
  • Appeler la méthode begin de l'objet NFCNDEFReaderSession et attendre un callback
    • Penser à instancier dans votre code les callbacks didInvalidateWithError et didDetectNDEFs

Projet de test

Prérequis : dernière version beta de XCode 9 (ici beta 6), un mac à jour (macOS 10.12.6 minimum), iOS 11 (ici beta 7)

1- Création du projet, Single View App, Swift
2- Ajout de la capacité "NFC Tag Reading" dans votre compte Developer Apple (Certificates, Identifiers & Profiles > App IDs)

3- Ajout dans le fichier Info.plist de la clé "Privacy - NFC Scan Usage Description"

4- Un peu de code : ouverture du fichier AppDelegate.swift :

5- Build & Run sur l'iPhone 7 :

Avenir

IOS 11 n'est pas encore terminé et continue de suivre son cycle de plusieurs Beta au fil du temps, jusqu'à la release finale. En attendant sa sortie, on peut espérer que CoreNFC permettra la gestion de certains tags RFID (NFC fait partie de la nébuleuse RFID), chose qui semble être relevée dans les communautés de développeurs mais pas encore rendue disponible au niveau de l'OS, qu'il sera compatible avec nos iPhone 6 (…) ou que l'on pourra émuler des cartes NFC au sein d'une application (à la manière d'Apple Pay), ou bien écrire directement sur des tags NFC vierges.

L'avenir nous le dira, mais iOS 11 commence à s'ouvrir pour différents développements et nous laisse imaginer de nouvelles applications pour les années à venir, Réalité Augmenté (ARKit framework), reconnaissances de visage et de caractères (Vision framework) et Machine Learning (CoreML framework) sont au programme !

A propos de l'auteur

Matthieu Ambrois
Chef de projet SQLI