Kern-NFC in Xamarin.iOS

Lesen von Nfc-Tags (Near Field Communication) mit iOS 11

CoreNFC ist ein neues Framework in iOS 11, das Zugriff auf das Nfc-Funkgerät ( Near Field Communication ) bietet, um Tags aus Apps zu lesen. CoreNFC funktioniert auf den Modellen iPhone 7, iPhone 7 Plus, iPhone 8, iPhone 8 Plus, iPhone X, iPhone XS und iPhone 11 (während die Modelle iPhone 6 und iPhone 6 Plus über NFC-Zahlungsfunktionen verfügen, unterstützen sie CoreNFC nicht).

Der NFC-Tagleser auf iOS-Geräten unterstützt alle NFC-Tagtypen 1 bis 5, die NDEF-Informationen ( NFC Data Exchange Format ) enthalten.

Es gibt einige Einschränkungen, die Sie beachten müssen:

  • CoreNFC unterstützt nur das Lesen von Tags (nicht schreiben oder formatieren).
  • Tagscans müssen vom Benutzer initiiert und nach 60 Sekunden timeout ausgeführt werden.
  • Apps müssen zum Scannen im Vordergrund sichtbar sein.
  • CoreNFC kann nur auf echten Geräten (nicht im Simulator) getestet werden.

Auf dieser Seite wird die konfiguration beschrieben, die für die Verwendung von CoreNFC erforderlich ist, und es wird gezeigt, wie die API mithilfe des Beispielcodes "NFCTagReader" verwendet wird.

Konfiguration

Um CoreNFC zu aktivieren, müssen Sie drei Elemente in Ihrem Projekt konfigurieren:

  • Ein Info.plist-Datenschutzschlüssel .
  • Ein Entitlements.plist-Eintrag .
  • Ein Bereitstellungsprofil mit NFC-Taglesefunktion .

Info.plist

Fügen Sie den NFCReaderUsageDescription-Datenschutzschlüssel und den Text hinzu, der dem Benutzer während der Überprüfung angezeigt wird. Verwenden Sie eine für Ihre Anwendung geeignete Nachricht (z. B. erläutern Sie den Zweck der Überprüfung):

<key>NFCReaderUsageDescription</key>
<string>NFC tag to read NDEF messages into the application</string>

Entitlements.plist

Ihre App muss die Funktion Near Field Communications Tag Reading mithilfe des folgenden Schlüssel-Wert-Paars in Ihrer Entitlements.plist anfordern:

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

Bereitstellungsprofil

Erstellen Sie eine neue App-ID , und stellen Sie sicher, dass der NFC-Taglesedienst aktiviert ist:

Seite

Anschließend sollten Sie ein neues Bereitstellungsprofil für diese App-ID erstellen, es dann herunterladen und auf Ihrem Entwicklungs-Mac installieren.

Lesen eines Tags

Nachdem Ihr Projekt konfiguriert wurde, fügen Sie using CoreNFC; am Anfang der Datei hinzu, und führen Sie die folgenden drei Schritte aus, um NFC-Tag-Lesefunktionen zu implementieren:

1. Implementieren INFCNdefReaderSessionDelegate

Die -Schnittstelle verfügt über zwei Methoden, die implementiert werden müssen:

  • DidDetect – Wird aufgerufen, wenn ein Tag erfolgreich gelesen wird.
  • DidInvalidate – Wird aufgerufen, wenn ein Fehler auftritt oder das Timeout von 60 Sekunden erreicht wird.

DidDetect

Im Beispielcode wird jede gescannte Nachricht einer Tabellenansicht hinzugefügt:

public void DidDetect(NFCNdefReaderSession session, NFCNdefMessage[] messages)
{
    foreach (NFCNdefMessage msg in messages)
    {  // adds the messages to a list view
        DetectedMessages.Add(msg);
    }
    DispatchQueue.MainQueue.DispatchAsync(() =>
    {
        this.TableView.ReloadData();
    });
}

Diese Methode kann mehrmals aufgerufen werden (und ein Array von Nachrichten kann übergeben werden), wenn die Sitzung mehrere Taglesevorgänge zulässt. Dies wird mithilfe des dritten Parameters der Start -Methode festgelegt (in Schritt 2 erläutert).

DidInvalidate

Eine Ungültigkeit kann aus verschiedenen Gründen auftreten:

  • Während der Überprüfung ist ein Fehler aufgetreten.
  • Die App befindet sich nicht mehr im Vordergrund.
  • Der Benutzer hat die Überprüfung abgebrochen.
  • Die Überprüfung wurde von der App abgebrochen.

Der folgende Code zeigt, wie ein Fehler behandelt wird:

public void DidInvalidate(NFCNdefReaderSession session, NSError error)
{
    var readerError = (NFCReaderError)(long)error.Code;
    if (readerError != NFCReaderError.ReaderSessionInvalidationErrorFirstNDEFTagRead &&
        readerError != NFCReaderError.ReaderSessionInvalidationErrorUserCanceled)
    {
      // some error handling
    }
}

Nachdem eine Sitzung ungültig wurde, muss ein neues Sitzungsobjekt erstellt werden, um erneut zu überprüfen.

2. Starten sie NFCNdefReaderSession

Die Überprüfung sollte mit einer Benutzeranforderung beginnen, z. B. durch Drücken einer Schaltfläche. Der folgende Code erstellt und startet eine Überprüfungssitzung:

Session = new NFCNdefReaderSession(this, null, true);
Session?.BeginSession();

Die Parameter für den NFCNdefReaderSession Konstruktor sind wie folgt:

  • delegate – Eine Implementierung von INFCNdefReaderSessionDelegate. Im Beispielcode wird der Delegat im Tabellenansichtscontroller implementiert und daher this als Delegatparameter verwendet.
  • queue – Die Warteschlange, in der Rückrufe verarbeitet werden. Dies kann sein null. In diesem Fall sollten Sie beim Aktualisieren von Benutzeroberflächensteuerelementen unbedingt verwenden DispatchQueue.MainQueue (wie im Beispiel gezeigt).
  • invalidateAfterFirstRead – Wenn true, wird die Überprüfung nach der ersten erfolgreichen Überprüfung beendet. Wenn false die Überprüfung fortgesetzt wird und mehrere Ergebnisse zurückgegeben werden, bis die Überprüfung abgebrochen oder das Timeout von 60 Sekunden erreicht ist.

3. Abbrechen der Überprüfungssitzung

Der Benutzer kann die Überprüfungssitzung über eine vom System bereitgestellte Schaltfläche in der Benutzeroberfläche abbrechen:

Schaltfläche

Die App kann die Überprüfung programmgesteuert abbrechen, indem sie die InvalidateSession -Methode aufruft:

Session.InvalidateSession();

In beiden Fällen wird die Methode des DidInvalidate Delegaten aufgerufen.

Zusammenfassung

CoreNFC ermöglicht Es Ihrer App, Daten aus NFC-Tags zu lesen. Es unterstützt das Lesen einer Vielzahl von Tagformaten (NDEF-Typen 1 bis 5), unterstützt jedoch nicht das Schreiben oder Formatieren.