Compartir vía


Core NFC en Xamarin.iOS

Leer etiquetas de comunicación de campo cercano (NFC) con iOS 11

CoreNFC es un nuevo marco en iOS 11 que proporciona acceso a la radio de comunicación de campo cercano (NFC) para leer etiquetas desde dentro de las aplicaciones. CoreNFC funciona en los modelos iPhone 7, iPhone 7 Plus, iPhone 8, iPhone 8 Plus, iPhone X, iPhone XS y iPhone 11 (aunque los modelos iPhone 6 y iPhone 6 Plus tienen funcionalidad de pago NFC, no son compatibles con CoreNFC).

El lector de etiquetas NFC de los dispositivos iOS admite todos los tipos de etiquetas NFC del 1 al 5 que contienen información del formato de intercambio de datos NFC (NDEF).

Hay algunas restricciones que debe tener en cuenta:

  • CoreNFC solo admite la lectura de etiquetas (no admite la lectura ni la aplicación de formato).
  • Los exámenes de etiquetas los debe iniciar el usuario y agotar el tiempo de espera después de 60 segundos.
  • Las aplicaciones deben estar visibles en primer plano para el examen.
  • CoreNFC solo se puede probar en dispositivos reales (no en el simulador).

En esta página se describe la configuración necesaria para usar CoreNFC y se muestra cómo usar la API.

Configuración

Para habilitar CoreNFC, debe configurar tres elementos en el proyecto:

  • Una clave de privacidad de Info.plist.
  • Una entrada Entitlements.plist.
  • Un perfil de aprovisionamiento con la funcionalidad de lectura de etiquetas NFC.

Info.plist

Agregue el texto y la clave de privacidad NFCReaderUsageDescription, que se muestra al usuario mientras se realiza el examen. Use un mensaje adecuado para la aplicación (por ejemplo, explique el propósito del examen):

<key>NFCReaderUsageDescription</key>
<string>NFC tag to read NDEF messages into the application</string>

Entitlements.plist

La aplicación debe solicitar la funcionalidad de lectura de etiquetas de comunicaciones de campo cercano mediante el siguiente par clave-valor en Entitlements.plist:

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

Perfil de aprovisionamiento

Cree un nuevo identificador de aplicación y asegúrese de que el servicio de lectura de etiquetas NFC esté marcado:

Nueva página de identificador de aplicación del Portal para desarrolladores con la lectura de etiquetas NFC seleccionada

A continuación, debe crear un nuevo perfil de aprovisionamiento para este identificador de aplicación y, a continuación, descargarlo e instalarlo en el equipo Mac de desarrollo.

Leer una etiqueta

Una vez configurado el proyecto, agregue using CoreNFC; a la parte superior del archivo y siga estos tres pasos para implementar la funcionalidad de lectura de etiquetas NFC:

1. Implementar INFCNdefReaderSessionDelegate

La interfaz tiene dos métodos que deben implementarse:

  • DidDetect: se llama cuando se lee correctamente una etiqueta.
  • DidInvalidate: se llama cuando se produce un error o se alcanza el tiempo de espera de 60 segundos.

DidDetect

En el código de ejemplo, cada mensaje escaneado se agrega a una vista de tabla:

public void DidDetect(NFCNdefReaderSession session, NFCNdefMessage[] messages)
{
    foreach (NFCNdefMessage msg in messages)
    {  // adds the messages to a list view
        DetectedMessages.Add(msg);
    }
    DispatchQueue.MainQueue.DispatchAsync(() =>
    {
        this.TableView.ReloadData();
    });
}

Este método se puede llamar varias veces (y se puede pasar una matriz de mensajes) si la sesión permite varias lecturas de etiquetas. Esto se establece mediante el tercer parámetro del método Start (se explica en el paso 2).

DidInvalidate

La invalidación puede producirse por varias razones:

  • Se ha producido un error al examinar.
  • La aplicación dejó de estar en primer plano.
  • El usuario optó por cancelar el examen.
  • La aplicación canceló el examen.

El código siguiente muestra cómo controlar un error:

public void DidInvalidate(NFCNdefReaderSession session, NSError error)
{
    var readerError = (NFCReaderError)(long)error.Code;
    if (readerError != NFCReaderError.ReaderSessionInvalidationErrorFirstNDEFTagRead &&
        readerError != NFCReaderError.ReaderSessionInvalidationErrorUserCanceled)
    {
      // some error handling
    }
}

Una vez que se ha invalidado una sesión, se debe crear un nuevo objeto de sesión para volver a examinarlo.

2. Iniciar un NFCNdefReaderSession

El examen debe comenzar con una solicitud de usuario, como una pulsación de botón. El código siguiente crea e inicia una sesión de examen:

Session = new NFCNdefReaderSession(this, null, true);
Session?.BeginSession();

Los parámetros del constructor NFCNdefReaderSession son los siguientes:

  • delegate: una implementación de INFCNdefReaderSessionDelegate. En el código de ejemplo, el delegado se implementa en el controlador de vista de tabla, por lo que this se usa como parámetro delegado.
  • queue: la cola en la que se controlan las devoluciones de llamada. Puede ser null, en cuyo caso asegúrese de usar el DispatchQueue.MainQueue al actualizar controles de interfaz de usuario (como se muestra en el ejemplo).
  • invalidateAfterFirstRead: cuando true, el examen se detiene después del primer examen correcto; cuando false el examen continuará y se devolverán varios resultados hasta que se cancele el examen o se alcance el tiempo de espera de 60 segundos.

3. Cancelar la sesión de examen

El usuario puede cancelar la sesión de examen a través de un botón proporcionado por el sistema en la interfaz de usuario:

Botón Cancelar mientras se examina

La aplicación puede cancelar mediante programación el examen llamando al método InvalidateSession:

Session.InvalidateSession();

En ambos casos, se llamará al método DidInvalidate del delegado.

Resumen

CoreNFC permite a la aplicación leer datos de etiquetas NFC. Admite la lectura de diversos formatos de etiquetas (tipos NDEF del 1 al 5), pero no admite la escritura ni la aplicación de formato.