O que um aplicativo iOS tem de declarar antes de poder ler uma tag?
Três coisas, todas no projeto: o recurso Near Field Communication Tag Reading, que acrescenta a autorização; uma string NFCReaderUsageDescription no Info.plist, sem a qual a Apple diz que o aplicativo encerra ao tentar ler; e, para uma sessão de tag, os identificadores de aplicação ISO 7816 ou os códigos de sistema FeliCa que ele vai selecionar.
O recurso e a autorização dele
Um aplicativo lê tags só com o recurso Near Field Communication Tag Reading ligado para o alvo dele. O exemplo de leitor de tags da Apple lista o que essa etapa faz: ela acrescenta a função de leitura de tags ao App ID e a autorização dos formatos de sessão de leitura ao arquivo de autorizações.
A página de referência da autorização lista hoje um único valor, TAG, descrito como acesso de leitura e gravação por NFCTagReaderSession, e a instrução dela é ligar o recurso no Xcode em vez de editar o arquivo.
A descrição de uso
NFCReaderUsageDescription, mostrada no Xcode como Privacy - NFC Scan Usage Description, é uma string no Info.plist que diz às pessoas por que o aplicativo quer o hardware NFC. A página de referência dela a marca como exigida para todo aplicativo que usa APIs que acessam esse hardware.
A ausência dela não é um alerta. O exemplo afirma que um aplicativo que tenta ler uma tag sem a chave e a string dela encerra.
Ela também é um texto diferente do que a folha de leitura mostra. A documentação de alertMessage separa os dois: a descrição de uso explica por que o aplicativo pede, e a mensagem de alerta diz ao usuário o que fazer durante uma leitura.
Identificadores de aplicação e códigos de sistema
Uma sessão de tag entrega uma tag ISO 7816 só para os identificadores de aplicação listados em com.apple.developer.nfc.readersession.iso7816.select-identifiers no Info.plist. A documentação de NFCISO7816Tag descreve o que acontece: a sessão envia um SELECT para cada identificador, na ordem da lista, e informa a tag depois do primeiro que der certo, com o identificador selecionado em initialSelectedAID.
A ordem portanto importa, e um identificador em particular também. Listar D2760000850101, a aplicação NDEF das tags MIFARE DESFire, faz uma tag dessas chegar como NFCISO7816Tag; deixá-lo de fora entrega a mesma tag como NFCMiFareTag.
As tags FeliCa precisam dos códigos de sistema delas listados do mesmo jeito, na chave que a referência da Apple chama ISO18092 system codes for NFC Tag Reader Session. A partir do iOS 26.4, uma Configuration de sessão consegue estreitar os identificadores por sessão, mas só entre os que já estão no Info.plist: a referência diz que as entradas desconhecidas são descartadas.
O que o código ainda confere
As declarações não garantem o hardware. readingAvailable diz se o aparelho consegue ler tags, e a apresentação do framework da Apple pede aos aplicativos que confiram isso antes de iniciar uma sessão.
E alguns identificadores não podem ser selecionados de jeito nenhum. A documentação da sessão de tag diz que ela não suporta selecionar identificadores de aplicação ligados a pagamento, e aponta os aplicativos da União Europeia para NFCPaymentTagReaderSession.
Perguntas frequentes
Um aplicativo que só lê NDEF precisa da autorização?
Sim. O exemplo de leitor de tags da Apple, que só lê NDEF, liga o recurso de leitura de tags, e é esse recurso que acrescenta a autorização.
O que acontece se NFCReaderUsageDescription faltar?
O exemplo da Apple afirma que o aplicativo encerra quando tenta ler uma tag sem a chave e a string dela.
Por que a minha tag DESFire chega como ISO 7816 em vez de MIFARE?
O Info.plist lista D2760000850101, o identificador da aplicação NDEF nas tags DESFire. Tire-o para receber a tag como NFCMiFareTag.
Um aplicativo pode selecionar a aplicação de um cartão de pagamento?
Não por NFCTagReaderSession, que não suporta identificadores ligados a pagamento. Na União Europeia, a Apple documenta NFCPaymentTagReaderSession para esse caso.