Solución:
En el sitio para desarrolladores de Apple, cree un nuevo ID de aplicación y asegúrese de que NFC Tag Reading
está habilitado.
Agregue las siguientes líneas a su archivo .plist:
<key>NFCReaderUsageDescription</key>
<string>NFC Tag!</string>
y estos al archivo de derechos:
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
Debería verse algo como esto en los archivos correspondientes:
Además, Core NFC se puede habilitar a través de la pestaña Capacidades en Xcode.
C objetivo
Importar CoreNFC
#import <CoreNFC/CoreNFC.h>
y configure el delegado:
@interface YourViewController : UIViewController <NFCNDEFReaderSessionDelegate>
En 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];
}
En la devolución de llamada del delegado:
- (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);
}
}
}
También debe agregar el didInvalidateWithError
delega la devolución de llamada o no cumplirás con el protocolo:
- (void)readerSession:(nonnull NFCNDEFReaderSession *)session didInvalidateWithError:(nonnull NSError *)error {
}
Puede detener al lector con:
[session invalidateSession];
Rápido 3/4
Importar CoreNFC
import CoreNFC
y configure el delegado:
class YourViewController: UIViewController, NFCNDEFReaderSessionDelegate
En viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
let session = NFCNDEFReaderSession(delegate: self,
queue: DispatchQueue(label: "queueName", attributes: .concurrent), invalidateAfterFirstRead: false)
session?.begin()
}
En la devolución de llamada del delegado:
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
for message in messages {
for record in message.records {
print(record.payload)
}
}
}
Puede detener al lector con:
session.invalidateSession
Uso
Después de iniciar la vista, debería ver inmediatamente el cuadro de diálogo del lector NFC de iOS así:
Una vez que aparece este cuadro de diálogo, tiene aproximadamente un segundo para colocar el iPhone cerca de la etiqueta NFC que desea leer. De lo contrario, el campo está desactivado (esto parece ser un error por parte de Apple). A menudo necesitaba cancelar y volver a intentar para obtener lecturas consistentes. Más detalles aquí.
Para solucionar este problema, puede agregar com.apple.developer.nfc.readersession.formats
clave en su archivo de derechos. La clave debe estar asociada con la matriz de tipos de NFS habilitados. Por ejemplo, puede intentar lo siguiente:
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
Funcionó para mí.
Actualizado para la segunda versión beta de Xcode.
Agregue la capacidad NFC a su aplicación desde el Centro de desarrolladores. Identificadores -> ID de aplicaciones -> habilitar “Lectura de etiquetas NFC”.
Si su proyecto no tiene un archivo de autorización, deje que Xcode cree uno para usted simplemente activando y luego desactivando cualquier capacidad desde dentro de Xcode -> Objetivos del proyecto -> Capacidades. Encontrarás un nuevo [AppName]Archivo .entitlements en su navegador de proyectos. Haga clic derecho en ese archivo y seleccione “Abrir como -> Código fuente”. Ingrese la siguiente entrada manualmente entre <dict></dict>
:
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
Tan pronto como Xcode 9 permita habilitar la lectura de etiquetas NFC desde la selección de Capacidades, este paso se vuelve obsoleto porque todo lo que tiene que hacer es habilitarlo allí. La versión Beta actual (primera) no es compatible con esto.
También debe ingresar una descripción de uso para la advertencia de privacidad que iOS le mostrará al usuario. (Por el momento (beta 1), esta advertencia se mostrará cuando el dispositivo esté listo para escanear y muestre un diálogo del sistema nativo que incluirá este mensaje. Sin embargo, esto parece no estar disponible). Abra el Info.plist de su objetivo y comience a escribir “Privacidad” y puede desplazarse hacia abajo hasta “Privacidad – Descripción de uso de NFC” para seleccionarla presionando regresar. Ingrese una explicación significativa para su usuario en la columna de la derecha.
Ahora debería poder importar CoreNFC, en Swift:
import CoreNFC
Luego dirígete a la documentación de Apple.
Importante: Si el compilador devuelve un error con Beta 2 ya no tiene este problema. Sin embargo, todavía se requiere hardware real en forma de iPhone 7 / p para las pruebas reales.No such module 'CoreNFC'
compruebe si ha seleccionado un dispositivo iOS 11 real para construir, no un simulador. También tiene que ser el iPhone 7 o 7 plus. Esto podría cambiar en una versión futura, pero la prueba de NFC solo funcionará completamente con el hardware real. (cp. Core Bluetooth donde puede ejecutar el Simulador pero no probar las capacidades reales).