engineering-design-and-analysis
Verwendung des Ios Core Nfc Framework für den kontaktlosen Datenaustausch
Table of Contents
Das iOS Core NFC Framework für den kontaktlosen Datenaustausch
Das iOS Core NFC Framework bietet Entwicklern die Möglichkeit, Anwendungen zu erstellen, die NFC-Tags lesen und schreiben, was einen schnellen, sicheren und direkten kontaktlosen Datenaustausch ermöglicht. Da die NFC-Technologie zu einem Grundnahrungsmittel in Einzelhandel, Transport, Zugriffskontrolle und mehr wird, öffnet das Verständnis, wie dieses Framework in Ihre iOS-App integriert werden kann, die Tür zu modernen, reibungslosen Benutzererfahrungen. Dieser Artikel bietet eine umfassende, produktionsbereite Anleitung zum Core NFC Framework - von der Ersteinrichtung und Sitzungsverwaltung bis hin zu erweiterten Funktionen und der realen Bereitstellung.
Ein kurzer Überblick über NFC auf iOS
Near Field Communication (NFC) ist ein Nahbereichsstandard für drahtlose Verbindungen, der mit 13,56 MHz arbeitet. Apple führte das Core NFC-Framework mit iOS 11 ein, das ursprünglich auf das Lesen von NFC Data Exchange Format (NDEF)-Tags beschränkt war. Nachfolgende iOS-Versionen erweiterten die Funktionen: iOS 13 fügte Unterstützung für das Schreiben von NDEF-Tags und Hintergrund-Tag-Lesefunktionen hinzu, während iOS 14 und später die Kompatibilität mit ISO-7816, ISO-15693 und FeliCa-Tags verbesserte. Heute ist Core NFC auf dem iPhone 7 und höher verfügbar und erreicht Millionen von Benutzern.
NFC arbeitet über eine Distanz von wenigen Zentimetern und ist damit ideal für „Tap-to-Interact-Szenarien wie Zahlungs-, Loyalitäts-, Ticketing- und Identitätsüberprüfungen. Das Framework abstrahiert die Low-Level-Funkkommunikation und lässt Entwickler sich auf das Parsen und den Umgang mit den von NFC-Tags empfangenen Daten konzentrieren.
Kern-NFC-Rahmenkapazitäten
Zu verstehen, was das Core NFC Framework tun kann (und was nicht), ist vor Beginn der Entwicklung unerlässlich.
- NDEF-Tag-Lesen – Lesen Sie NDEF-Nachrichten von kompatiblen NFC-Tags (ISO 14443, FeliCa und ISO 15693 in späteren iOS-Versionen).
- NDEF-Tag-Schreiben – Schreiben Sie NDEF-Nachrichten in wiederbeschreibbare Tags (iOS 13+).
- Hintergrund-Tag-Lesen – NFC-Tags erkennen und lesen, auch wenn sich Ihre App im Hintergrund befindet (iOS 13+).
- ISO‐7816 und ISO‐14443‐4 Kommunikation – Exchange Application Protocol Data Units (APDUs) für Zahlungs-, Zugriffskontrolle und Regierungs-ID-Anwendungen.
- Benutzerdefiniertes Befehlssenden – Senden Sie proprietäre Befehle an MIFARE und andere Karten, sofern Sie über die erforderlichen Berechtigungen vom MIFARE/NXP-Anbieter verfügen.
Bemerkenswerte Einschränkungen: Core NFC unterstützt keinen Peer-to-Peer-Datenaustausch, die Host-basierte Kartenemulation (HCE) ist unter iOS nicht verfügbar (Apple Pay verwendet einen anderen sicheren Elementpfad) und der NFC-Controller ist ausschließlich für die Vordergrund-App verfügbar, es sei denn, es wird Hintergrund gelesen.
Projektvoraussetzungen
Hardware- und Softwareanforderungen
- Ein iPhone 7 oder höher (iPhone SE, 6s und frühere Modelle haben keine NFC-Hardwareunterstützung für Core NFC).
- Xcode 12 oder höher (für Hintergrundlese- und Schreibunterstützung).
- iOS 13+ wird für volle NDEF-Schreib- und Hintergrundfunktionen empfohlen, obwohl das Lesen allein auf iOS 11 zurückgreift.
- Ein Apple Developer-Konto (kostenlose Konten können auf physischen Geräten getestet werden; der kommerzielle Vertrieb erfordert ein kostenpflichtiges Konto).
Ermöglichung des Kern-NFC-Anteils
Navigieren Sie in Ihrem Xcode-Projekt zu Signing & Capabilities und fügen Sie die Near Field Communication Tag Reading-Fähigkeit hinzu. Diese Aktion fügt die erforderliche Berechtigungsdatei hinzu und stellt sicher, dass Ihre App den Zugriff auf NFC-Hardware anfordern kann.
Konfigurieren Ihrer App für NFC
Info: PLUTT Key
Fügen Sie den -Schlüssel zu Ihrem hinzu, indem Sie erklären, warum Ihre App NFC-Zugriff benötigt.
<key>NFCReaderUsageDescription</key>
<string>This app uses NFC to read your loyalty cards and event tickets.</string>
Wenn Ihre App Tags schreibt, müssen Sie auch den -Schlüssel (iOS 13+) hinzufügen.
Hintergrundmodi
Um das Lesen von Hintergrund-Tags zu ermöglichen, aktivieren Sie die Fähigkeit Hintergrundmodi und überprüfen Sie Near Field Communication Tag Reading. Darüber hinaus muss Ihre App die implementieren und darauf vorbereitet sein, die Tag-Erkennung im Hintergrund zu handhaben.
Kern-NFC-Sitzungslebenszyklus
Das zentrale Objekt zum Lesen von NDEF-Tags ist . Eine Sitzung beginnt, wenn Sie aufrufen und endet automatisch, wenn ein Tag gelesen wird (wenn wahr ist) oder wenn Sie ihn manuell ungültig machen. Während der Sitzung zeigt das System eine systemzustellbare Benutzeroberflächenwarnung an, die den Benutzer auffordert, das Gerät in der Nähe eines Tags zu halten.
Beginn einer Sitzung
import CoreNFC
class NFCHandler: NSObject, NFCNDEFReaderSessionDelegate {
private var session: NFCNDEFReaderSession?
func beginScanning() {
guard NFCNDEFReaderSession.readingAvailable else {
print("NFC is not available on this device.")
return
}
session = NFCNDEFReaderSession(delegate: self, queue: DispatchQueue.main, invalidateAfterFirstRead: true)
session?.alertMessage = "Hold your iPhone near the tag."
session?.begin()
}
}
Bearbeitung von Delegate Callbacks
Implementieren Sie die beiden erforderlichen Delegiertenmethoden:
- – Aufruf, wenn eine oder mehrere NDEF-Nachrichten erfolgreich gelesen werden.
- – Wird aufgerufen, wenn die Sitzung endet, entweder weil ein Tag gelesen wurde oder ein Fehler aufgetreten ist (z. B. Benutzer abgebrochen, nicht unterstützter Tag).
Beispielhafte Umsetzung:
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
for message in messages {
for record in message.records {
let payload = String(data: record.payload, encoding: .utf8) ?? "Unknown"
print("NDEF Record type: \(record.typeNameFormat), payload: \(payload)")
}
}
}
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
if let readerError = error as? NFCReaderError {
switch readerError.code {
case .readerSessionInvalidationErrorUserCanceled:
print("User cancelled scanning.")
case .readerSessionInvalidationErrorSessionTimeout:
print("Session timed out.")
default:
print("Session error: \(error.localizedDescription)")
}
}
}
Lesen von NDEF-Tags in der Tiefe
NFC-Tags speichern Daten typischerweise im NDEF-Format. Eine NDEF-Nachricht kann einen oder mehrere Datensätze mit jeweils einem Typ, einer Kennung und einer Nutzlast enthalten.
Vergleich der Nutzlasten von Datensätzen
Um die Nutzlast zu interpretieren, prüfen Sie die und die Daten:
func handleRecord(_ record: NFCNDEFPayload) {
switch record.typeNameFormat {
case .nfcWellKnown:
if record.type == NFCTypeNameFormat.wellKnownTypeText {
let textPayload = String(data: record.payload, encoding: .utf8) ?? ""
print("Text: \(textPayload)")
} else if record.type == NFCTypeNameFormat.wellKnownTypeURI {
let uriPayload = String(data: record.payload, encoding: .utf8) ?? ""
print("URI: \(uriPayload)")
}
case .absoluteURI:
let absoluteURI = String(data: record.payload, encoding: .utf8) ?? ""
print("Absolute URI: \(absoluteURI)")
default:
print("Unhandled type name format: \(record.typeNameFormat)")
}
}
Schreiben von NDEF-Tags
Beginnend mit iOS 13 können Sie NDEF-Nachrichten mit (oder dem kombinierten mit Schreibfähigkeit) in kompatible Tags schreiben.
Hier ist ein kompaktes Beispiel mit mit Schreibunterstützung:
func writeToTag() {
let session = NFCNDEFReaderSession(delegate: self, queue: .main, invalidateAfterFirstRead: false)
session.alertMessage = "Hold your iPhone near the tag to write."
session.begin()
}
func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
guard let tag = tags.first else { return }
session.connect(to: tag) { error in
guard error == nil else { return }
// Create an NDEF message
let payload = NFCNDEFPayload(
format: .nfcWellKnown,
type: NFCTypeNameFormat.wellKnownTypeURI.data(using: .utf8)!,
identifier: Data(),
payload: "https://example.com".data(using: .utf8)!
)
let message = NFCNDEFMessage(records: [payload])
tag.queryNDEFStatus { status, _, error in
guard status == .readWrite, error == nil else { return }
tag.writeNDEF(message) { error in
if error == nil {
print("Write successful.")
}
session.invalidate()
}
}
}
}
Hinweis: Das Schreiben funktioniert nur mit wiederbeschreibbaren Tags (Typ 2, Typ 4 usw.), einige Tags (wie MIFARE Classic) erfordern möglicherweise eine spezielle Handhabung oder sind möglicherweise gesperrt.
Hintergrund Tag Reading
Wenn der entsprechende Berechtigungs- und Hintergrundmodus aktiviert ist, kann Ihre App NFC-Tags erkennen, auch wenn sie sich nicht im Vordergrund befinden. Das System startet oder nimmt Ihre App wieder auf und liefert die Tag-Daten über die gleichen Delegiertenmethoden. Sie müssen sicherstellen, dass Ihre App das Tag schnell behandelt, da die Hintergrundsitzung zeitlich begrenzt ist.
Eckpunkte für die Hintergrundlesung:
- Fügen Sie den Hintergrundmodus Near Field Communication Tag Reading hinzu.
- Das System zeigt eine Warnung mit dem Namen Ihrer App und optional dem an, das Sie vor dem Ende der Sitzung eingestellt haben.
- Wenn die App nicht im Hintergrund läuft, startet das System sie für einige Sekunden im Hintergrund.
Advanced NFC: ISO‐7816 und APDU-Kommunikation
Für Anwendungen, die eine direkte Kommunikation mit einem sicheren Element innerhalb einer Karte erfordern (z. B. Zahlungsterminals, Transitkarten, Regierungs-IDs), verwenden Sie Objekte der oder , die das Senden und Empfangen von APDU-Befehlen gemäß ISO-7816-4-Standard ermöglichen.
Beispiel: Kommunikation mit einer MIFARE DESFire Card
func readerSession(_ session: NFCReaderSession, didDetect tags: [NFCISO7816Tag]) {
guard let tag = tags.first else { return }
session.connect(to: tag) { error in
guard error == nil else { return }
// Send SELECT command
let selectCommand = NFCISO7816APDU(
instructionClass: 0x00,
instructionCode: 0xA4,
p1Parameter: 0x04,
p2Parameter: 0x00,
data: Data([0xA0, 0x00, 0x00, 0x03, 0x00, 0x00]),
expectedResponseLength: -1
)
tag.sendCommand(apdu: selectCommand) { response, sw1, sw2, error in
if error == nil {
print("Command succeeded, SW1=\(sw1), SW2=\(sw2)")
}
}
}
}
Die erweiterte Verwendung von ISO-7816-Tags erfordert ein tiefes Verständnis des Befehlssatzes der Zielkarte. Die Apple Core NFC Dokumentation bietet die vollständige API-Referenz.
Sicherheits- und Datenschutzbedenken
NFC auf iOS ist mit Privatsphäre und Sicherheit an vorderster Front konzipiert:
- Benutzerzustimmung – Eine NFC-Sitzung beginnt immer mit einer sichtbaren Systemwarnung. Der Benutzer muss das Gerät aktiv in der Nähe eines Tags halten; die App kann nicht stillschweigend scannen.
- Datenverschlüsselung – Für sensible Operationen (z. B. Zahlungen) kommuniziert der NFC-Controller mit dem sicheren Element im iPhone. Die Tag-Daten selbst werden nicht vom Framework verschlüsselt - Ihre App muss bei Bedarf eine eigene Verschlüsselung anwenden.
- Tag Content Validation – Validieren Sie immer die Nutzlast von NFC-Tags, bevor Sie sie verwenden.
- Recht und Pist Keys – Apple überprüft Ihre Nutzungsbeschreibung; die missbräuchliche Verwendung von NFC-Funktionen kann zu einer Ablehnung der App führen.
Real-World Use Cases erweitert
Core NFC ermöglicht eine Vielzahl von kontaktlosen Interaktionen:
- Kontaktlose Zahlungen und Loyalität – Integrieren Sie sich in bestehende NFC-ausgestattete Zahlungsterminals oder verwenden Sie das Framework, um gespeicherte Wertkarten und Loyalitätspunkte zu lesen.
- Zugriffssteuerung – Ersetzen Sie physische Schlüssel durch Ihre iOS-App. Lesen Sie Anmeldeinformationen von Zugriffsabzeichen oder schreiben Sie temporäre Zugriffsrechte auf Tags.
- Öffentlicher Transport – Implementierung von Tap-to-read-Funktionen für Transitpässe (z. B. FeliCa-Tags in Japan; ISO-14443 in vielen europäischen Systemen).
- Smart packaging – Lassen Sie die Benutzer auf Produktpakete tippen, um Authentizitätsinformationen, Ablaufdaten oder Werbeinhalte anzuzeigen.
- Museums- und Einzelhandelsinformationspunkte – Platzieren Sie NFC-Tags neben Exponaten oder Produkten, um beim Tippen reiche Medieninhalte zu liefern.
- Medizinisch und pharmazeutisch – Lesen Sie Patientenarmbänder oder Medikamentenetiketten, um Identität und Dosierung zu überprüfen.
Zur Inspiration siehe Apples WWDC 2020-Sitzung zu NFC und den offiziellen Core NFC-Beispielcode.
Performance Optimierung und Best Practices
- Reduzieren Sie die Sitzungsdauer – Setzen Sie auf true, wenn Sie nur ein Tag benötigen.
- Verwende eine dedizierte Warteschlange – Übergeben Sie eine serielle Warteschlange an den Session-Initializer, um zu vermeiden, dass der Hauptthread während der Tag-Verarbeitung blockiert wird.
- Handle NFCReaderError gracefully – Überprüfen Sie immer nach Fehlern wie und geben Sie dem Benutzer klare Nachrichten.
- Test mit echten Tags – Der Simulator unterstützt NFC nicht. Verwenden Sie eine Vielzahl von physischen Tags (Typ 2, Typ 4, MIFARE), um die Kompatibilität zu gewährleisten.
- Umfrageschleifen vermeiden – Sobald ein Tag erkannt wurde, verarbeiten Sie ihn sofort und beenden Sie die Sitzung.
Problembehandlung bei gemeinsamen Problemen
| Problem | Solution |
|---|---|
NFCNDEFReaderSession.readingAvailable returns false | Ensure the device is iPhone 7 or later. Check that the NFC capability is enabled in Xcode and the entitlement file is present. |
| Session starts but no tag is detected | Make sure the tag is NDEF‑formatted and placed correctly near the top‑back of the iPhone (near the camera). Some thick cases can interfere. |
| App rejected due to missing usage description | Add both NFCReaderUsageDescription and (if writing) NFCWriteAccessUsageDescription to Info.plist. |
| Background reading not triggering | Enable the “Near Field Communication Tag Reading” background mode. Also ensure the app was terminated properly (not force‑killed). |
| Writing fails with “tag not writable” | Check if the tag is locked or read‑only. Some tags require a password before writing. |
Die Zukunft von NFC auf iOS
Apple entwickelt Core NFC mit jedem iOS-Release weiter. Gerüchten zufolge und neue Funktionen umfassen eine erweiterte Unterstützung für ISO-15693 (in Bibliotheksbüchern und einigen Inventar-Tags verwendet), mögliche Lesebereichsverbesserungen und eine tiefere Integration in Wallet und Express-Modus. Entwickler sollten die Core NFC Release Notes überwachen, um auf dem neuesten Stand zu bleiben.
Schlussfolgerung
Das iOS Core NFC-Framework ist ein robustes, gut konzipiertes Tool, um jeden iPhone-App kontaktlosen Datenaustausch hinzuzufügen. Durch die Beherrschung des Sitzungslebenszyklus, des NDEF-Handlings und der fortschrittlichen Tag-Kommunikation können Sie alles von einfachen Visitenkarten-Scans bis hin zu anspruchsvollen Zugriffskontrollsystemen liefern. Beginnen Sie mit dem Aufbau eines minimalen Lesegeräts und erweitern Sie dann die Schreib- und Hintergrundfunktionen, wie es Ihr Anwendungsfall erfordert. Mit Millionen von NFC ausgestatteten iPhones im Feld war die Möglichkeit, nahtlose, Tap-basierte Erlebnisse zu schaffen, noch nie so groß.