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:
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 deINFCNdefReaderSessionDelegate
. En el código de ejemplo, el delegado se implementa en el controlador de vista de tabla, por lo quethis
se usa como parámetro delegado.queue
: la cola en la que se controlan las devoluciones de llamada. Puede sernull
, en cuyo caso asegúrese de usar elDispatchQueue.MainQueue
al actualizar controles de interfaz de usuario (como se muestra en el ejemplo).invalidateAfterFirstRead
: cuandotrue
, el examen se detiene después del primer examen correcto; cuandofalse
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:
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.