Ir para o conteúdo
Idioma: PT

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.