web-dev-qa-db-fra.com

iOS 11 Core NFC - un exemple de code?

Je viens d'installer le premier iOS 11 beta sur un iPhone 7 et je suis intéressé par le NFC. Il n'y a rien à ce sujet dans les paramètres. Je me demande s'il existe un exemple de code indiquant comment lire une balise. Quelqu'un peut-il montrer comment utiliser le SDK Core NFC dans un extrait de code?

15
Blisterpeanuts

Sur le site Apple Developer, créez un nouvel ID d'application et assurez-vous que NFC Tag Reading est activé. 

 Dev portal capabilities

Ajoutez les lignes suivantes à votre fichier .plist:

<key>NFCReaderUsageDescription</key>
<string>NFC Tag!</string>

et ceux-ci au fichier de droits:

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

Cela devrait ressembler à ceci dans les fichiers correspondants:

 enter image description here

De plus, le noyau NFC peut être activé via l'onglet Capabilities de Xcode.

 enter image description here

Objectif c

Importer CoreNFC

#import <CoreNFC/CoreNFC.h>

et définir le délégué:

@interface YourViewController : UIViewController <NFCNDEFReaderSessionDelegate>

Dans viewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NFCNDEFReaderSession *session = [[NFCNDEFReaderSession alloc] initWithDelegate:self queue:dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT) invalidateAfterFirstRead:NO];
    [session beginSession];
}

Dans le rappel du délégué:

- (void) readerSession:(nonnull NFCNDEFReaderSession *)session didDetectNDEFs:(nonnull NSArray<NFCNDEFMessage *> *)messages {

    for (NFCNDEFMessage *message in messages) {
        for (NFCNDEFPayload *payload in message.records) {
            NSLog(@"Payload data:%@",payload.payload);
        }
    }        
}

Vous devez également ajouter le callback délégué didInvalidateWithError sinon vous ne serez pas conforme au protocole:

- (void)readerSession:(nonnull NFCNDEFReaderSession *)session didInvalidateWithError:(nonnull NSError *)error {

}

Vous pouvez arrêter le lecteur avec:

[session invalidateSession];

Swift 3/4

Importer CoreNFC

import CoreNFC

et définir le délégué:

class YourViewController: UIViewController, NFCNDEFReaderSessionDelegate

Dans viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()

        let session = NFCNDEFReaderSession(delegate: self,
                      queue: DispatchQueue(label: "queueName", attributes: .concurrent), invalidateAfterFirstRead: false)  
        session?.begin()
    }

Dans le rappel du délégué:

func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
  for message in messages {
    for record in message.records {
      print(record.payload)
    }
  }
}

Vous pouvez arrêter le lecteur avec:

session.invalidateSession

Usage

Après avoir lancé la vue, vous devriez immédiatement voir la boîte de dialogue du lecteur iOS NFC ainsi:

 iOS NFC reader dialog

Une fois que cette boîte de dialogue apparaît, vous avez environ une seconde pour placer l'iPhone près de la balise NFC que vous souhaitez lire. Sinon, le champ est désactivé (cela semble être un bug de la part d'Apple). J'ai souvent eu besoin d'annuler et de réessayer pour obtenir des lectures cohérentes. Plus de détails ici

28
Boris

Pour résoudre ce problème, vous devez ajouter la clé com.Apple.developer.nfc.readersession.formats dans votre fichier de droits. La clé doit être associée à un tableau de types nfs activés . Par exemple, vous pouvez l'ajouter à vos droits.

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

Cela a fonctionné pour moi.

4
Max

Mise à jour pour la deuxième version bêta de Xcode.

Ajoutez la fonctionnalité NFC à votre application à partir du Centre des développeurs. Identifiers -> ID de l'application -> activer "Lecture de balises NFC".

Si votre projet ne possède pas de fichier de droit, laissez Xcode en créer un pour vous en activant puis en désactivant ensuite toute fonctionnalité depuis Xcode -> Cibles du projet -> Capacités. Vous trouverez un nouveau fichier [NomApplication] .entitlements dans le navigateur de votre projet. Cliquez avec le bouton droit sur ce fichier et sélectionnez "Ouvrir en tant que -> Code source". Entrez l'entrée suivante manuellement entre <dict></dict>:

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

Dès que Xcode 9 autorise l'activation NFC Lecture de balise à partir de la sélection Capabilities, cette étape devient obsolète car il ne vous reste plus qu'à l'activer. La (première) version bêta actuelle ne le supporte pas.

Vous devez également entrer une description d'utilisation pour l'avertissement de confidentialité que iOS affichera à l'utilisateur. (À l'heure actuelle (version 1), cet avertissement s'affiche lorsque l'appareil est prêt à analyser et affiche une boîte de dialogue système native contenant ce message. Toutefois, cela semble être unploished.) Ouvrez l'Info.plist de votre cible et commencez à taper "Confidentialité" et vous pouvez faire défiler jusqu'à "Confidentialité - NFC Description de l'utilisation" "pour le sélectionner en appuyant sur retour. Entrez une explication significative pour votre utilisateur dans la colonne de droite.

Vous devriez maintenant pouvoir importer CoreNFC, dans Swift:

import CoreNFC

Puis rendez-vous sur la documentation d'Apple.

Important: Si le compilateur renvoie une erreur avec No such module 'CoreNFC', cochez si vous avez sélectionné un périphérique iOS 11 à créer, et non un simulateur. Il doit également s'agir de l'iPhone 7 ou 7 plus. Cela pourrait changer dans une version ultérieure, mais les tests NFC ne fonctionneront jamais entièrement avec du matériel réel. (cp. Core Bluetooth où vous pouvez exécuter sur Simulator mais pas tester les capacités réelles.) La bêta 2 n'a plus ce problème. Cependant, le matériel réel sous forme d'iPhone 7/p est toujours requis pour les tests.

4
ff10

Juste pour enrichir les réponses précédentes, il est important de garder à l’esprit ces considérations de la classe NFCNDEFReaderSession:

  • Session de lecture pour le traitement des balises NDEF (Data Exchange Format) NFC. Cette session nécessite le droit "com.Apple.developer.nfc.readersession.formats" dans votre processus. De plus, le Info.plist de votre application doit contenir une chaîne de description d'utilisation non vide.
  • Une session de lecteur NDEF analysera et détectera automatiquement les balises NFC Forum Contenant un message NDEF valide. NFC Les types de balises Forum 1 à 5 .__ qui sont au format NDEF sont pris en charge . Une interface utilisateur de système modal présentera Une fois que -beginSession sera appelé pour indiquer le début de la session; la feuille UI est automatiquement supprimée lorsque la session est invalidée par l'utilisateur ou en appelant -invalidateSession.
  • Une session ouverte a un délai de 60 secondes restriction après l'appel de -beginSession; -readerSession:didInvalidateWithError: renverra une erreur NFCReaderSessionInvalidationErrorSessionTimeout lorsque la limite de temps sera atteinte.
  • Une seule session de lecture active est autorisée dans le système ; -readerSession:didInvalidateWithError: retournera NFCReaderSessionInvalidationErrorSystemIsBusy lorsqu’une nouvelle session de lecture est lancée par -beginSession lorsqu’une session de lecture est active.
  • -readerSession:didInvalidateWithError: retournera NFCReaderSessionInvalidationErrorUserCanceled lorsque l'utilisateur cliquera sur le bouton Terminé de l'interface utilisateur.
  • -readerSession:didInvalidateWithError: retournera NFCReaderSessionInvalidationErrorSessionTerminatedUnexpectedly lorsque l'application client entrera dans l'état d'arrière-plan .-readerSession:didInvalidateWithError: retournera NFCReaderErrorUnsupportedFeature lorsque
    1. fonction de mode de lecteur n'est pas disponible sur le matériel
    2. l’application cliente ne dispose pas du droit requis.
3
GoRoS

Vous devez vous assurer que la description d'utilisation est en place et ajouter la possibilité à l'application à l'intérieur du Centre de développement Apple. J'ai un tutoriel basé sur mon expérience (basé sur Swift 4). Il est disponible ici: Didacticiel Core NFC

1
Jameson

mes deux centimes:

1) sous xcode 9.0 (beta 4 9M189t) si vous avez déjà ajouté des fonctionnalités, Pas besoin d’ajouter manuellement:

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

c'est fait automatiquement

2) pas de crash si vous n'utilisez pas l'iPhone 7 OR vous êtes dans le simulateur:

Vous serez appelé à:

func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
        print(error.localizedDescription)
    }

il montrera: "Fonctionnalité non supportée"

3) ne manquez pas:

self.nfcSession?.begin() // will trigger callback

alors:

    final private func setup(){
    self.nfcSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
    self.nfcSession?.alertMessage = "Put your NFC TAG over iPhone.."
    self.nfcSession?.begin() // will trigger callback

}

4) si l'utilisateur annule, vous obtiendrez:

"La session est invalidée par l'annulation de l'utilisateur"

dans le rappel didInvalidateWithError.

0
ingconti

J'ai ajouté Core NFC à un projet en utilisant les ressources de ces réponses. Une chose supplémentaire qui n’a pas été notée cependant est que même si vous ajoutez la fonctionnalité manuellement via les droits, Xcode ne semble pas examiner le fichier, sauf si une fonctionnalité est activée. Cela est probablement dû au fait que Xcode 9 Beta 1 ne dispose pas de Core NFC comme commutateur de capacité pour des exemples de projets. Veillez donc à activer au moins une autre capacité si vous rencontrez toujours des problèmes! Je voyais une erreur de terminaison inattendue se produire immédiatement jusqu'à ce que je le fasse.

Je laisserais cela comme un commentaire, mais je n'ai pas encore assez de réputation pour le faire. Compris que c'était assez important à noter.

0
Cole