Core NFC in Xamarin.iOS
Lesen von Nfc-Tags (Near Field Communication) mit iOS 11
CoreNFC ist ein neues Framework in iOS 11, das den Zugriff auf das Near Field Communication (NFC)-Radio zum Lesen von Tags in Apps ermöglicht. CoreNFC arbeitet an i Telefon 7, i Telefon 7 Plus, i Telefon 8, i Telefon 8 Plus, i Telefon X, i Telefon XS und i Telefon 11 Modellen (während i Telefon 6 und i Telefon 6 Plus-Modelle NFC-Zahlungsfunktionen haben sie keine Unterstützung CoreNFC).
Der NFC-Tagleser in iOS-Geräten unterstützt alle NFC-Tagtypen 1 bis 5, die NFC Data Exchange Format (NDEF)-Informationen enthalten.
Es gibt einige Einschränkungen, die zu beachten sind:
- 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 im Vordergrund zum Scannen sichtbar sein.
- CoreNFC kann nur auf realen Geräten (nicht auf dem Simulator) getestet werden.
Auf dieser Seite wird die Konfiguration beschrieben, die für die Verwendung von CoreNFC erforderlich ist, und zeigt, wie die API verwendet wird.
Konfiguration
Um CoreNFC zu aktivieren, müssen Sie drei Elemente in Ihrem Projekt konfigurieren:
- Ein Info.plist-Datenschutzschlüssel .
- Ein Eintrag "Entitlements.plist ".
- Ein Bereitstellungsprofil mit NFC-Tag-Lesefunktion .
Info.plist
Fügen Sie den NFCReaderUsageDescription-Datenschutzschlüssel und Text hinzu, der dem Benutzer beim Scannen angezeigt wird. Verwenden Sie eine für Ihre Anwendung geeignete Nachricht (z. B. erläutern Sie den Zweck des Scans):
<key>NFCReaderUsageDescription</key>
<string>NFC tag to read NDEF messages into the application</string>
Entitlements.plist
Ihre App muss die Near Field Communications Tag Reading-Funktion mithilfe des folgenden Schlüssel-Wert-Paars in Ihrer Berechtigungsliste 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-Tag-Lesedienst abgehakt ist:
Anschließend sollten Sie ein neues Bereitstellungsprofil für diese App-ID erstellen und dann auf Ihrem Entwicklungs-Mac herunterladen und 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 die Lesefunktionalität von NFC-Tags zu implementieren:
1. Implementieren INFCNdefReaderSessionDelegate
Die Schnittstelle verfügt über zwei Zu implementierende Methoden:
DidDetect
– Wird aufgerufen, wenn ein Tag erfolgreich gelesen wird.DidInvalidate
– Wird aufgerufen, wenn ein Fehler auftritt oder das Timeout von 60 Sekunden erreicht ist.
DidDetect
Im Beispielcode wird jede gescannte Nachricht zu 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 einer Reihe von Gründen auftreten:
- Fehler beim Scannen.
- Die App wurde nicht mehr im Vordergrund angezeigt.
- Der Benutzer hat sich entschieden, den Scan abzubrechen.
- Der Scan 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 es erneut zu überprüfen.
2. Starten eines NFCNdefReaderSession
Das Scannen sollte mit einer Benutzeranforderung beginnen, z. B. mit einem Tastendruck. Der folgende Code erstellt und startet eine Scansitzung:
Session = new NFCNdefReaderSession(this, null, true);
Session?.BeginSession();
Die Parameter für den NFCNdefReaderSession
Konstruktor sind wie folgt:
delegate
– Eine Umsetzung vonINFCNdefReaderSessionDelegate
. Im Beispielcode wird der Delegat im Tabellenansichtscontroller implementiert, daherthis
als Delegatparameter verwendet.queue
– Die Warteschlange, auf der Rückrufe verarbeitet werden. Dies kannnull
in diesem Fall der Fall sein, dass Sie beim Aktualisieren vonDispatchQueue.MainQueue
Benutzeroberflächensteuerelementen (wie im Beispiel gezeigt) verwenden.invalidateAfterFirstRead
– Wenntrue
der Scan nach dem ersten erfolgreichen Scan beendet wird. Wennfalse
die Überprüfung fortgesetzt wird und mehrere Ergebnisse zurückgegeben werden, bis der Scan abgebrochen wird oder das 60-sekunden-Timeout erreicht ist.
3. Abbrechen der Scansitzung
Der Benutzer kann die Scansitzung über eine vom System bereitgestellte Schaltfläche auf der Benutzeroberfläche abbrechen:
Die App kann die Überprüfung programmgesteuert abbrechen, indem sie die InvalidateSession
Methode aufruft:
Session.InvalidateSession();
In beiden Fällen wird die Methode der DidInvalidate
Stellvertretung aufgerufen.
Zusammenfassung
CoreNFC ermöglicht Ihrer App das Lesen von Daten aus NFC-Tags. Es unterstützt das Lesen einer Vielzahl von Tagformaten (NDEF-Typen 1 bis 5), unterstützt jedoch nicht das Schreiben oder Formatieren.