it-swarm.com.de

iOS 11 Core NFC - irgendein Beispielcode?

Ich habe gerade die erste iOS 11-Beta auf einem iPhone 7 installiert und möchte NFC ausprobieren. Daran ist nichts in den Einstellungen. Ich frage mich, ob es irgendwo einen Beispielcode gibt, der zeigt, wie ein Tag gelesen wird. Kann jemand zeigen, wie das Core NFC SDK in einem Code-Snippet verwendet wird?

15
Blisterpeanuts

Erstellen Sie auf der Apple Developer Site eine neue App-ID, und stellen Sie sicher, dass NFC Tag Reading aktiviert ist. 

 Dev portal capabilities

Fügen Sie Ihrer .plist-Datei die folgenden Zeilen hinzu:

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

und diese in die Berechtigungsdatei:

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

In den entsprechenden Dateien sollte es ungefähr so ​​aussehen:

 enter image description here

Auch Core NFC kann über die Registerkarte Capabilities in Xcode aktiviert werden.

 enter image description here

Ziel c

CoreNFC importieren

#import <CoreNFC/CoreNFC.h>

und setze den Delegierten:

@interface YourViewController : UIViewController <NFCNDEFReaderSessionDelegate>

In 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];
}

Im Rückruf des Delegaten:

- (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);
        }
    }        
}

Sie müssen außerdem den Delegate-Callback didInvalidateWithError hinzufügen, da Sie sonst das Protokoll nicht einhalten:

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

}

Sie können den Leser stoppen mit:

[session invalidateSession];

Swift 3/4

CoreNFC importieren

import CoreNFC

und setze den Delegierten:

class YourViewController: UIViewController, NFCNDEFReaderSessionDelegate

In viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()

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

Im Rückruf des Delegaten:

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

Sie können den Leser stoppen mit:

session.invalidateSession

Verwendungszweck

Nachdem Sie die Ansicht gestartet haben, sollten Sie sofort den iOS NFC - Reader-Dialog sehen:

 iOS NFC reader dialog

Sobald dieser Dialog erscheint, haben Sie ungefähr eine Sekunde, um das iPhone in der Nähe des NFC - Tags zu platzieren, das Sie lesen möchten. Andernfalls ist das Feld deaktiviert (dies scheint ein Fehler auf Apples Ende zu sein). Ich musste oft abbrechen und es erneut versuchen, um konsistente Messwerte zu erhalten. Weitere Details hier

28
Boris

Um dieses Problem zu beheben, sollten Sie den Schlüssel com.Apple.developer.nfc.readersession.formats in Ihre Berechtigungsdatei einfügen. Der Schlüssel sollte einem Array mit aktivierten nfs-Typen zugeordnet sein ..__ Sie können dies beispielsweise in Ihre Berechtigungen einfügen.

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

Es hat für mich funktioniert.

4
Max

Aktualisiert für die zweite Xcode-Betaversion.

Fügen Sie Ihrer App die Funktion NFC aus dem Developer Center hinzu. Bezeichner -> App-IDs -> Aktivieren Sie "NFC-Tag-Lesen".

Wenn für Ihr Projekt keine Berechtigungsdatei vorhanden ist, lassen Sie Xcode eine für Sie erstellen, indem Sie einfach jede Funktion in Xcode -> Projektziele -> Funktionen aktivieren und anschließend deaktivieren. In Ihrem Projektnavigator finden Sie eine neue [AppName] .entitlements-Datei. Klicken Sie mit der rechten Maustaste auf diese Datei und wählen Sie "Öffnen als -> Quellcode". Geben Sie den folgenden Eintrag manuell zwischen <dict></dict> ein:

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

Sobald Xcode 9 das Markieren von NFC -Tags aus der Capabilities-Auswahl aktiviert, ist dieser Schritt hinfällig, da Sie ihn dort nur aktivieren müssen. Die aktuelle (erste) Beta-Version unterstützt dies nicht.

Sie müssen auch eine Verwendungsbeschreibung eingeben, um die Datenschutzwarnung anzuzeigen, die iOS dem Benutzer anzeigt. (Im Moment (Beta 1) wird diese Warnung angezeigt, wenn das Gerät zum Scannen bereit ist, und es wird ein systemeigener Systemdialog angezeigt, in dem diese Meldung enthalten ist. Dies scheint jedoch unzweckmäßig.) Öffnen Sie die Info.plist Ihres Ziels und beginnen Sie mit der Eingabe "Datenschutz" und Sie können zu "Datenschutz - NFC Usage Description" "blättern, um ihn durch Drücken der Eingabetaste auszuwählen. Geben Sie in der rechten Spalte eine aussagekräftige Erklärung für Ihren Benutzer ein.

Nun sollten Sie CoreNFC in Swift importieren können:

import CoreNFC

Dann gehen Sie zu Apple Dokumentation .

Important: Wenn der Compiler einen Fehler zurückgibt, überprüfen Sie mit No such module 'CoreNFC', ob Sie ein iOS 11-Gerät ausgewählt haben, für das ein Build erstellt werden soll, und keinen Simulator. Es muss auch das iPhone 7 oder 7 plus sein. Dies kann sich in einer zukünftigen Version ändern. Das Testen von NFC funktioniert jedoch immer nur mit der tatsächlichen Hardware. (cp. Core Bluetooth, wo Sie mit dem Simulator arbeiten können, ohne die tatsächlichen Fähigkeiten zu testen.) Beta 2 hat dieses Problem nicht mehr. Für das Testen ist jedoch immer noch Hardware in Form von iPhone 7/p erforderlich.

4
ff10

Um die vorherigen Antworten zu bereichern, ist es wichtig, diese Überlegungen speziell für die NFCNDEFReaderSession-Klasse zu berücksichtigen:

  • Lesersitzung zur Verarbeitung NFC NDEF-Tags (Data Exchange Format). Diese Sitzung erfordert die Berechtigung "com.Apple.developer.nfc.readersession.formats" in Ihrem Prozess. Außerdem muss Info.plist Ihrer Anwendung eine nicht leere Verwendungsbeschreibungszeichenfolge enthalten.
  • Eine NDEF-Lesersitzung scannt und erkennt NFC - Forum -Tags, die eine gültige NDEF-Nachricht enthalten. NFC Forum-Tag-Typ 1 bis 5 , Das NDEF-formatiert ist, wird unterstützt. Eine modale System-Benutzeroberfläche zeigt Sobald -beginSession aufgerufen wird, um den Beginn der Sitzung zu informieren. Das UI-Blatt wird automatisch verworfen, wenn die Sitzung ungültig gemacht wird entweder vom Benutzer oder durch Aufruf von -invalidateSession.
  • Eine geöffnete Sitzung hat eine Beschränkung von 60 Sekunden, nachdem -beginSession aufgerufen wurde. -readerSession:didInvalidateWithError: gibt den Fehler NFCReaderSessionInvalidationErrorSessionTimeout zurück, wenn das Zeitlimit erreicht ist.
  • Nur eine aktive Lesersitzung ist im System erlaubt; -readerSession:didInvalidateWithError: gibt NFCReaderSessionInvalidationErrorSystemIsBusy zurück, wenn -beginSession eine neue Lesersitzung initiiert, wenn eine aktive Lesersitzung vorhanden ist.
  • -readerSession:didInvalidateWithError: gibt NFCReaderSessionInvalidationErrorUserCanceled zurück, wenn der Benutzer auf der Schaltfläche "Fertig" auf der Benutzeroberfläche klickt.
  • -readerSession:didInvalidateWithError: gibt NFCReaderSessionInvalidationErrorSessionTerminatedUnexpectedlyzurück, wenn die Clientanwendung in den Hintergrundstatus wechselt .-readerSession:didInvalidateWithError: gibt NFCReaderErrorUnsupportedFeature zurück, wenn
    1. die Lesemodusfunktion ist auf der Hardware nicht verfügbar
    2. clientanwendung verfügt nicht über die erforderliche Berechtigung.
3
GoRoS

Sie müssen sicherstellen, dass die Verwendungsbeschreibung vorhanden ist, und der App im Apple Developer Center die Funktion hinzufügen. __ Ich habe ein auf meiner Erfahrung basierendes Lernprogramm (auf Swift 4 basierend). Es ist hier verfügbar: Core NFC Tutorial

1
Jameson

meine zwei Cent:

1) unter xcode 9.0 (beta 4 9M189t), wenn Sie bereits Funktionen hinzugefügt haben

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

es erfolgt automatisch

2) kein Absturz, wenn Sie kein iPhone 7 OR verwenden, sind Sie im Simulator:

Sie werden angerufen werden:

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

es wird zeigen: "Funktion nicht unterstützt"

3) nicht verpassen:

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

so:

    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) Wenn der Benutzer abbricht, erhalten Sie:

Msgstr "Sitzung wird durch Benutzerabbruch ungültig gemacht"

in didInvalidateWithError-Rückruf.

0
ingconti

Ich habe Core NFC zu einem Projekt hinzugefügt und dabei die Ressourcen in diesen Antworten verwendet. Eine weitere Sache, die nicht beachtet wurde, war, dass Xcode die Datei, auch wenn Sie die Funktion manuell über die Berechtigungen manuell hinzufügen, nicht auf die Datei sieht, wenn Sie keine Funktion aktiviert haben. Dies liegt wahrscheinlich daran, dass Xcode 9 Beta 1 keinen Core NFC als Fähigkeitsumschaltung für viele Beispielprojekte von Personen hat. Stellen Sie also sicher, dass Sie mindestens eine weitere Funktion aktivieren, wenn Sie immer noch Probleme sehen! Ich sah einen unerwarteten Beendigungsfehler, der sofort zurückkehrte, bis ich dies tat.

Ich würde dies als Kommentar belassen, aber es hat noch nicht genug Ansehen. Ich dachte, das war wichtig genug, um es zu bemerken.

0
Cole