Saltar al contenido
Idioma: ES

¿Por qué una sesión de Core NFC termina sola?

Porque la termina el sistema, y dice cuál de cinco cosas ha pasado: se ha leído la primera etiqueta NDEF, se ha cancelado, la sesión ha expirado, el sistema estaba ocupado, o ha terminado de forma inesperada. Después no se puede reiniciar, así que la app crea una nueva.

Las cinco maneras de terminar

Apple las agrupa como errores de sesión, y sus nombres dicen lo que ha pasado. readerSessionInvalidationErrorFirstNDEFTagRead llega cuando una sesión creada para leer una etiqueta la ha leído. readerSessionInvalidationErrorUserCanceled significa que se ha cerrado la hoja. readerSessionInvalidationErrorSessionTimeout significa que la sesión ha expirado. readerSessionInvalidationErrorSystemIsBusy significa que el sistema la ha rechazado por razones suyas, y readerSessionInvalidationErrorSessionTerminatedUnexpectedly cubre el resto.

Solo uno de ellos es un fallo de tu app, y suele ser el primero: una sesión creada con invalidateAfterFirstRead puesto a verdadero cuando la app quería seguir leyendo, cosa que desenreda la página de las varias etiquetas. Los demás son el sistema y quien usa el teléfono haciendo su trabajo.

La expiración sin número

Apple documenta el error y no la duración. Una sesión que se queda abierta sin nada delante termina sola, y ningún valor de la referencia dice cuándo, así que una app que lee una serie larga cuenta con abrir una sesión nueva en vez de suponer que la primera va a durar.

Ese silencio tiene una consecuencia práctica: la duración no es algo que se deba fijar en el código a partir de una medida hecha en un teléfono y en una versión. Con lo que puede contar el código es con que el error llegue, y con lo que hace entonces.

Lo que hace la app después

Una sesión es de un solo uso. Una vez invalidada no puede volver a escanear, así que la app crea una nueva, cosa que el propio ejemplo de lector de etiquetas de Apple hace después de cada invalidación. Todo lo que la app tuviera de la sesión anterior, etiquetas incluidas, está caducado.

Di por qué, cuando quien usa el teléfono pueda hacer algo. invalidate(errorMessage:) termina una sesión con un mensaje en la hoja del sistema, y alertMessage pone el texto durante ella: esos dos son todo el vocabulario que la app tiene dentro de la hoja, que la página de la hoja de lectura describe desde el otro lado. Una sesión cancelada no necesita mensaje ninguno; un sistema ocupado merece un reintento y no una explicación.

Qué comprobar antes de abrir una

readingAvailable responde si el aparato puede leer siquiera, y Apple pide a las aplicaciones que lo comprueben antes de crear una sesión. readerErrorRadioDisabled existe para una radio apagada, y readerErrorUnsupportedFeature para una función que la sesión no admite.

Y en el sistema solo funciona una sesión de lector a la vez, así que una segunda espera: una app que abre una sesión mientras hay otra abierta no ha fallado, está en cola, cosa que la página de las sesiones cubre con el resto del modelo.

Preguntas frecuentes

¿Puedo reiniciar una sesión invalidada?

No. Una sesión es de un solo uso: una vez invalidada no puede volver a escanear, y la app crea una nueva.

¿Cuánto tarda una sesión en expirar?

La referencia de Apple no da ninguna duración. Trata el error de expiración y abre una sesión nueva en vez de depender de un valor medido.

¿Cuál de las invalidaciones es culpa mía?

Normalmente la primera etiqueta NDEF leída, cuando la sesión se creó para terminar tras una etiqueta y la app quería seguir leyendo.

¿Qué significa que el sistema está ocupado?

El sistema ha rechazado la sesión por razones suyas. Reintenta una vez, y díselo a quien usa el teléfono solo si persiste.