Saltar al contenido

iOS 11 Core NFC: ¿algún código de muestra?

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.

Capacidades del portal de desarrollo

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:

ingrese la descripción de la imagen aquí

Además, Core NFC se puede habilitar a través de la pestaña Capacidades en Xcode.

ingrese la descripción de la imagen aquí

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í:

Cuadro de diálogo del lector NFC de iOS

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 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). 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *