Como um aplicativo iOS recebe uma tag lida em segundo plano?
Por um link universal. Nos iPhones que a suportam, o sistema lê a tag, pega o primeiro registro URI e mostra um aviso. Quando o usuário toca nele, o aplicativo que reivindica o link abre e recebe a mensagem NDEF inteira num NSUserActivity. Esquemas de URL próprios não funcionam, e sem o aplicativo o link abre no Safari.
O que o sistema faz
O artigo sobre a leitura em segundo plano da Apple descreve a sequência. O sistema lê a tag sem nenhum aplicativo aberto, mostra um aviso para cada tag nova, e entrega os dados só depois que o usuário toca nele; num iPhone bloqueado, ele pede antes que o usuário desbloqueie.
Ele procura uma coisa só na mensagem: um registro URI, do tipo bem conhecido U. Quando a mensagem guarda vários, o sistema usa o primeiro, e esse registro tem de conter ou um link universal ou um dos esquemas de URL que ele suporta.
A Apple afirma que o iPhone XS e os modelos posteriores suportam a leitura de tags em segundo plano. Nos modelos mais antigos o aplicativo tem de oferecer a leitura de dentro dele, o que o artigo recomenda em todos os casos.
Links universais, e não esquemas próprios
O artigo é explícito: a leitura em segundo plano não suporta esquemas de URL próprios, e os aplicativos devem usar links universais em vez disso. Os esquemas que ela trata pertencem ao sistema: links da web, e-mail, SMS, telefone, FaceTime, Mapas e configuração de acessório HomeKit.
Então a tag carrega um endereço https num domínio que o aplicativo reivindica. O aplicativo liga os Associated Domains e lista esse domínio, o que acrescenta a autorização de domínios associados ao projeto e ao App ID.
Quando nenhum aplicativo instalado reivindica o link, o sistema o abre no Safari. É essa a reserva que a página da abertura de aplicativo recomenda projetar: uma página que faça sentido sem o aplicativo.
O que o aplicativo recebe
O sistema abre o aplicativo, ou o traz para primeiro plano, e chama application(_:continue:restorationHandler:) com um NSUserActivity do tipo NSUserActivityTypeBrowsingWeb. A mensagem lida da tag está na propriedade ndefMessagePayload dele.
Confira que a atividade veio de uma tag. Para as atividades que não foram produzidas pela leitura em segundo plano, o artigo diz que a carga útil guarda um único registro do tipo vazio, então um aplicativo que também abre os links universais dele de outro lugar consegue distinguir os dois.
A mensagem inteira chega, e não só o link. Os outros registros da tag, um texto ou uma carga útil MIME depois do URI, ficam disponíveis para o aplicativo assim que ele abre.
Quando isso não acontece
A leitura em segundo plano roda só enquanto o iPhone está em uso, e o artigo lista os momentos em que ela não está disponível mesmo com a tela ligada: antes do primeiro desbloqueio, durante uma sessão de leitura do Core NFC, enquanto a carteira do Apple Pay está em uso, enquanto a câmera está em uso, e no modo avião.
Um aplicativo que lê com a própria sessão portanto bloqueia a leitura em segundo plano enquanto a sessão durar. O lado do usuário dessas condições está na página da leitura em segundo plano.
Perguntas frequentes
Um esquema de URL próprio consegue abrir o meu aplicativo a partir de uma tag?
Não pela leitura em segundo plano, que a documentação da Apple diz não suportar esquemas de URL próprios. Use um link universal num domínio que o aplicativo reivindica.
O aplicativo abre sem o usuário tocar em nada?
Não. O sistema mostra um aviso para cada tag nova e entrega os dados só depois que o usuário toca nele, pedindo antes um desbloqueio quando o celular está bloqueado.
Qual registro o sistema usa?
O primeiro registro URI da mensagem, do tipo bem conhecido U. A mensagem inteira é entregue depois ao aplicativo na atividade do usuário.
E se o aplicativo não estiver instalado?
O sistema abre o link no Safari, então o endereço deveria levar a uma página que faça sentido sem o aplicativo.