¿Cómo recibe una app iOS una etiqueta leída en segundo plano?
Mediante un enlace universal. En los iPhone que la admiten, el sistema lee la etiqueta, toma el primer registro URI y enseña un aviso. Al tocarlo, la aplicación que reclama el enlace se abre y recibe el mensaje NDEF entero en un NSUserActivity. Los esquemas de URL propios no valen, y sin la aplicación el enlace se abre en Safari.
Lo que hace el sistema
El artículo sobre la lectura en segundo plano de Apple describe la secuencia. El sistema lee la etiqueta sin ninguna aplicación abierta, enseña un aviso por cada etiqueta nueva, y entrega los datos solo después de que alguien lo toque; en un iPhone bloqueado, pide primero desbloquearlo.
Busca una sola cosa en el mensaje: un registro URI, del tipo conocido U. Cuando el mensaje contiene varios, el sistema usa el primero, y ese registro tiene que llevar o un enlace universal o uno de los esquemas de URL que admite.
Apple declara que el iPhone XS y posteriores admiten la lectura de etiquetas en segundo plano. En los modelos anteriores la aplicación tiene que ofrecer la lectura desde dentro, lo que el artículo recomienda en todos los casos.
Enlaces universales, no esquemas propios
El artículo es explícito: la lectura en segundo plano no admite esquemas de URL propios, y las aplicaciones deben usar enlaces universales en su lugar. Los esquemas que sí trata pertenecen al sistema: enlaces web, correo, SMS, teléfono, FaceTime, Mapas y la configuración de accesorios HomeKit.
Así que la etiqueta lleva una dirección https en un dominio que la aplicación reclama. La aplicación activa los dominios asociados y enumera ese dominio, lo que añade la autorización de dominios asociados al proyecto y al identificador de la aplicación.
Cuando ninguna aplicación instalada reclama el enlace, el sistema lo abre en Safari. Ese es el repliegue que la página de abrir una aplicación recomienda diseñar: una página que tenga sentido sin la aplicación.
Lo que recibe la aplicación
El sistema lanza la aplicación, o la trae al primer plano, y llama a application(_:continue:restorationHandler:) con un NSUserActivity de tipo NSUserActivityTypeBrowsingWeb. El mensaje leído de la etiqueta está en su propiedad ndefMessagePayload.
Comprueba que la actividad viene de una etiqueta. Para las actividades que no produce la lectura en segundo plano, dice el artículo, la carga contiene un solo registro del tipo vacío, así que una aplicación que también abre sus enlaces universales desde otra parte distingue las dos.
Llega el mensaje entero, no solo el enlace. Los demás registros de la etiqueta, un texto o una carga MIME detrás del URI, quedan a disposición de la aplicación una vez abierta.
Cuándo no ocurre
La lectura en segundo plano corre solo mientras el iPhone está en uso, y el artículo enumera momentos en que no está disponible ni con la pantalla encendida: antes del primer desbloqueo, durante una sesión de lectura de Core NFC, mientras se usa la cartera de Apple Pay, mientras se usa la cámara, y en modo avión.
Una aplicación que lee con su propia sesión bloquea por tanto la lectura en segundo plano mientras dure la sesión. El lado de quien usa el teléfono está en la página de la lectura en segundo plano.
Preguntas frecuentes
¿Puede un esquema de URL propio abrir mi app desde una etiqueta?
Mediante la lectura en segundo plano no, que según la documentación de Apple no admite esquemas de URL propios. Usa un enlace universal en un dominio que la aplicación reclame.
¿La app se abre sin que nadie toque nada?
No. El sistema enseña un aviso por cada etiqueta nueva y entrega los datos solo después de que alguien lo toque, pidiendo antes un desbloqueo cuando el teléfono está bloqueado.
¿Qué registro usa el sistema?
El primer registro URI del mensaje, del tipo conocido U. El mensaje entero se entrega después a la aplicación en la actividad.
¿Y si la aplicación no está instalada?
El sistema abre el enlace en Safari, así que la dirección debería llevar a una página que tenga sentido sin la aplicación.