Sessão NDEF ou sessão de tag: qual um aplicativo iOS deve abrir?
Uma sessão NDEF, quando o aplicativo só lê ou grava mensagens: cobre os tipos 1 a 5 do NFC Forum e exige as menores declarações. Uma sessão de tag, a partir do iOS 13, quando ele tem de falar com o próprio chip por APDU ISO 7816, blocos ISO 15693, FeliCa ou comandos MIFARE. Só uma sessão roda por vez.
O que uma sessão NDEF faz
O Core NFC lê dados NDEF de tags dos tipos 1 a 5, segundo a apresentação do framework da Apple, e NFCNDEFReaderSession é a sessão feita para isso. Ela entrega cada mensagem ao delegado dela por readerSession(_:didDetectNDEFs:), sem objeto de tag e sem comando.
A partir do iOS 13, a mesma sessão também consegue entregar as próprias tags. Um delegado que implementa readerSession(_:didDetect:) recebe objetos NFCNDEFTag, conecta-se a um, e consegue consultá-lo, gravá-lo e bloqueá-lo, como descreve a página da gravação.
O sinalizador invalidateAfterFirstRead decide quanto tempo a sessão vive. Em true, ela termina depois da primeira tag lida com sucesso; em false, ela continua lendo até expirar ou ser cancelada. A observação da Apple sobre o inicializador diz para pô-lo em false numa sessão que grava.
O que uma sessão de tag acrescenta
NFCTagReaderSession, disponível a partir do iOS 13, detecta tags pela tecnologia de rádio e não pelo conteúdo. As opções de sondagem dela escolhem o que ela procura: iso14443 para as tags compatíveis com ISO 7816 e as MIFARE, iso15693 para as tags de vizinhança, iso18092 para FeliCa, e a partir do iOS 16 uma opção pace.
Cada tag detectada chega como um valor NFCTag cujo caso dá o protocolo: NFCISO7816Tag para as APDU, NFCISO15693Tag para os comandos de bloco, NFCFeliCaTag, ou NFCMiFareTag para os comandos MIFARE. Cada um deles também está em conformidade com NFCNDEFTag, então uma sessão de tag lê e grava NDEF do mesmo jeito.
O preço está nas declarações. Além da autorização e da descrição de uso de que todo aplicativo Core NFC precisa, a documentação da classe entrega uma tag ISO 7816 só para os identificadores de aplicação listados no Info.plist, como explica a página das declarações.
Uma sessão por vez
Só uma sessão de leitura, de qualquer tipo, pode estar ativa no sistema por vez, diz a documentação da classe base, e as sessões a mais esperam numa fila atendida por ordem. Um aplicativo que inicia uma segunda sessão enquanto a primeira está aberta espera a primeira terminar.
Uma sessão também precisa do hardware. readingAvailable responde antes de qualquer coisa ser criada, e a Apple pede aos aplicativos que confiram isso primeiro; o Core NFC não está disponível em extensões de aplicativo de jeito nenhum.
E uma sessão termina de vez. Uma vez invalidada ela não consegue mais ler, e o aplicativo cria uma nova, que é o que o exemplo de leitor de tags da Apple faz depois de cada invalidação.
Escolher entre as duas
| Pergunta | Sessão NDEF | Sessão de tag |
|---|---|---|
| Disponível a partir de | iOS 11 para ler, iOS 13 para gravar | iOS 13 |
| O que ela entrega | Mensagens, ou tags NDEF por didDetect | Tags por protocolo, cada uma capaz de NDEF |
| Comandos ao chip | Nenhum | APDU, blocos ISO 15693, comandos FeliCa e MIFARE |
| Declarações a mais | Nenhuma | Identificadores de aplicação para ISO 7816, códigos de sistema para FeliCa |
Escolha a sessão NDEF quando a tag carrega uma mensagem e o trabalho do aplicativo é essa mensagem. Escolha a sessão de tag quando o aplicativo precisa do chip: um identificador, um contador, uma senha, um bloco de memória fora do NDEF.
Perguntas frequentes
Um aplicativo iOS pode ler uma tag sem a folha de leitura?
Não. Uma sessão de leitura mostra o alerta de leitura do sistema enquanto roda, e o aplicativo só escolhe a mensagem dentro dele, por alertMessage.
Uma sessão de tag lê NDEF também?
Sim. Todo tipo de tag que ela entrega também está em conformidade com NFCNDEFTag, então o aplicativo consegue ler e gravar NDEF depois de se conectar.
Duas sessões podem rodar ao mesmo tempo?
Não. Só uma sessão de leitura, de qualquer tipo, fica ativa no sistema, e as outras esperam numa fila atendida por ordem.
Por que a minha sessão NDEF termina depois da primeira tag?
invalidateAfterFirstRead está em true, e o delegado recebe readerSessionInvalidationErrorFirstNDEFTagRead quando a sessão termina. Ponha-o em false para continuar lendo ou para gravar.