iOS 11 Core NFC-jakiś przykładowy kod?

Właśnie zainstalowałem pierwszy iOS 11 beta na iPhone 7 i jestem zainteresowany wypróbowaniem NFC. W Ustawieniach nic nie ma. Zastanawiam się, czy jest jakiś przykładowy kod pokazujący, jak czytać tag. Czy ktoś może w fragmencie kodu pokazać jak używać Core NFC SDK?

Author: corvairjo, 2017-06-06

7 answers

W witrynie programisty Apple utwórz nowy identyfikator aplikacji i upewnij się, że NFC Tag Reading jest włączony.

Możliwości portalu Dev

Dodaj następujące linie do swojego .plik plist:

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

I te do pliku uprawnień:

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

Powinno wyglądać tak w odpowiednich plikach:

Tutaj wpisz opis obrazka

RĂłwnieĹź Core NFC moĹźna aktywowaÄ ‡ poprzez zakĹ ' adkÄ ™ Capabilities w Xcode.

Tutaj wpisz opis obrazka

Objective-c

Import CoreNFC

#import <CoreNFC/CoreNFC.h>

I ustaw delegata:

@interface YourViewController : UIViewController <NFCNDEFReaderSessionDelegate>

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

W delegacie:

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

Musisz również dodać didInvalidateWithError delegate callback albo nie będziesz zgodny z protokołem:

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

}

Możesz zatrzymać czytelnika za pomocą:

[session invalidateSession];

Swift 3/4

Import CoreNFC

import CoreNFC

I ustaw delegata:

class YourViewController: UIViewController, NFCNDEFReaderSessionDelegate

W viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()

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

W delegacie:

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

Możesz zatrzymać czytelnika za pomocą:

session.invalidateSession

Użycie

Po uruchomieniu widoku powinieneś natychmiast zobaczyć okno dialogowe czytnika NFC iOS w następujący sposób:

okno dialogowe czytnika NFC iOS

Gdy pojawi się to okno dialogowe, masz około sekundy, aby umieścić iPhone ' a w pobliżu tagu NFC, który chcesz przeczytać. W przeciwnym razie pole jest wyłączone(wydaje się, że jest to błąd na końcu Apple). Często musiałem anulować i ponowić próbę aby uzyskać spójne odczyty. więcej szczegółów tutaj .

 37
Author: Boris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-27 10:05:03

Aby rozwiązać ten problem, możesz dodać klucz com.apple.developer.nfc.readersession.formats do pliku uprawnień. Klucz powinien być skojarzony z tablicą włączonych typów NFS. Na przykład, możesz spróbować:

<key>com.apple.developer.nfc.readersession.formats</key>
<array>
    <string>NDEF</string>
</array>
U mnie zadziałało.

 5
Author: Maksim Ovtsin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-14 17:55:30

Aktualizacja dla drugiej wersji beta Xcode.

Dodaj funkcję NFC do aplikacji z Centrum programisty. identyfikatory - > identyfikatory aplikacji - > włącz "odczyt znaczników NFC".

Jeśli projekt nie ma pliku uprawnień, niech Xcode utworzyć jeden dla ciebie po prostu aktywacji, a następnie dezaktywacji wszelkich możliwości z Xcode - > cele projektu - > możliwości. Znajdziesz nową [AppName].plik uprawnień w Nawigatorze projektu. Kliknij prawym przyciskiem myszy na tym pliku i wybierz "Otwórz jako - > kod źródłowy". Wprowadź ręcznie następujący wpis pomiędzy <dict></dict>:

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

Jak tylko Xcode 9 pozwala na włączenie odczytu znaczników NFC z wyboru możliwości ten krok staje się przestarzały, ponieważ wszystko, co musisz zrobić, to włączyć go tam. Obecna (pierwsza) wersja Beta nie obsługuje tego.

Musisz również wprowadzić opis użycia, aby ostrzeżenie o prywatności iOS wyświetli użytkownikowi. (W tej chwili (beta 1) to Ostrzeżenie będzie wyświetlane, gdy urządzenie jest gotowy do skanowania i pokazuje natywny dialog systemowy, który będzie zawierał tę wiadomość. Wydaje się to jednak nieopłacalne.) Otwórz informacje o celu.plist i zacznij wpisywać "prywatność" i możesz przewinąć w dół do "prywatność-opis użycia NFC", aby wybrać go, naciskając return. Wprowadź sensowne wyjaśnienie dla użytkownika w prawej kolumnie.

Teraz powinieneś być w stanie zaimportować CoreNFC, w języku Swift:
import CoreNFC
Następnie udaj się do dokumentacji Apple ' a .

Ważne: jeśli kompilator zwróci błąd z No such module 'CoreNFC' Sprawdź, czy wybrałeś rzeczywiste urządzenie z systemem iOS 11 do zbudowania, a nie symulator. Musi to być również iPhone 7 lub 7 plus. Może się to zmienić w przyszłej wersji, ale testowanie NFC będzie w pełni działać tylko z faktycznym sprzętem. (cp. Rdzeń Bluetooth, gdzie można uruchomić na symulatorze, ale nie testować rzeczywistych możliwości.) Beta 2 nie ma już tego problemu. Jednak rzeczywisty sprzęt w postaci iPhone 7 / p jest nadal wymagane do rzeczywistych badań.

 4
Author: ff10,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 12:40:37

Aby wzbogacić poprzednie odpowiedzi, ważne jest, aby pamiętać o tych rozważaniach dotyczących klasy NFCNDEFReaderSession:

  • sesja czytnika do przetwarzania znaczników NFC Data Exchange Format (NDEF). Ta sesja wymaga uprawnienia " com.apple.developer.nfc.readersession.formats"w procesie. Ponadto Info.plist Twojej aplikacji musi zawierać niepusty łańcuch opisu użycia.
  • sesja czytnika NDEF automatycznie skanuje i wykrywa Forum NFC znaczniki zawierające poprawną wiadomość NDEF. NFC Tag Forum typ 1 do 5 to jest NDEF sformatowane są obsługiwane . UI systemu modalnego przedstawi po wywołaniu -beginSession, aby poinformować o rozpoczęciu sesji; Arkusz interfejsu użytkownika jest automatycznie odrzucany po unieważnieniu sesji przez użytkownika lub przez wywołanie -invalidateSession.
  • Otwarta sesja ma limit czasu 60 sekund po wywołaniu -beginSession; -readerSession:didInvalidateWithError: zwróci błąd NFCReaderSessionInvalidationErrorSessionTimeout po osiągnięciu limitu czasu.
  • tylko 1 aktywna sesja czytnika jest dozwolona w SYSTEM; -readerSession:didInvalidateWithError: zwróci NFCReaderSessionInvalidationErrorSystemIsBusy, gdy nowa sesja reader zostanie zainicjowana przez -beginSession, gdy jest aktywna sesja reader.
  • -readerSession:didInvalidateWithError: zwróci NFCReaderSessionInvalidationErrorUserCanceled, gdy użytkownik kliknie przycisk Gotowe w interfejsie użytkownika.
  • -readerSession:didInvalidateWithError: powróci NFCReaderSessionInvalidationErrorSessionTerminatedUnexpectedly gdy aplikacja kliencka wprowadzi stan tła . -readerSession:didInvalidateWithError: powróci NFCReaderErrorUnsupportedFeature gdy
      Funkcja trybu odczytu nie jest dostępna na sprzęcie.]}
    1. aplikacja kliencka nie posiada wymaganych / align = "left" /
 3
Author: GoRoS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 08:24:48

Musisz upewnić się, że opis użycia jest na miejscu, a także dodać tę funkcję do aplikacji wewnątrz centrum programisty Apple. Mam tutorial oparty na moim doświadczeniu(Swift 4-based). Jest on dostępny tutaj: Core NFC Tutorial

 1
Author: Jameson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-06 16:06:56

Dodałem Core NFC do projektu przy użyciu zasobów w tych odpowiedziach. Jedną dodatkową rzeczą, która nie została zauważona, było to, że nawet jeśli dodasz funkcję ręcznie za pośrednictwem uprawnień, Xcode nie wydaje się patrzeć na plik, chyba że masz włączoną funkcję. Jest to prawdopodobnie spowodowane Xcode 9 Beta 1 nie posiadające Core NFC jako przełącznik możliwości dla wielu projektów przykładowych ludzi. Więc pamiętaj, aby włączyć co najmniej jedną inną funkcję, jeśli nadal widzisz problemy! Widziałem nieoczekiwany błąd zakończenia natychmiast powraca, dopóki tego nie zrobię.

Zostawiłbym to jako komentarz, jak należy, ale nie mam jeszcze wystarczającej reputacji, aby to zrobić. Uznałem, że to na tyle ważne, żeby to zauważyć.

 0
Author: Cole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-16 15:49:53

Moje dwa grosze:

1) pod xcode 9.0 (beta 4 9M189t ) jeśli już dodałeś możliwości, nie ma potrzeby ręcznego dodawania:

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

Robi się to automatycznie

2) brak awarii, jeśli nie używasz iPhone 7 lub jesteś w symulatorze:

Zostaniesz wezwany:

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

Pokaże: "Funkcja nie jest obsługiwana"

3) nie przegap:

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

Więc:

    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) Jeśli Użytkownik anuluje, otrzymasz:

"sesja jest anulowana przez użytkownika anulowanie "

In didInvalidateWithError callback.

 0
Author: ingconti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-06 15:46:13