Ir para o conteúdo
Idioma: PT

O que um aplicativo iOS precisa para emular um cartão?

Três coisas que a Apple controla: a autorização de sessão de cartão, concedida mediante pedido sob um acordo comercial; um aparelho e um ambiente que o sistema considere elegíveis; e código que responda a APDU vindas do fluxo de eventos da sessão. O Core NFC oferece CardSession a partir do iOS 17.4, atrás de uma interface do sistema.

As autorizações vêm primeiro

A CardSession, a partir do iOS 17.4, é a classe que emula um cartão, e a documentação da Apple lista o que ela cobre no Espaço Econômico Europeu: pagamentos em loja, chaves de carro, transporte de circuito fechado, crachás corporativos, chaves de hotel, fidelidade e bilhetes de evento.

Três autorizações a governam. com.apple.developer.nfc.hce permite a API em absoluto, e sem ela criar uma sessão levanta um erro fatal. A autorização dos prefixos de identificador lista por que o aplicativo responde: identificadores de aplicação inteiros, identificadores de provedor registrados, ou prefixos pelo menos tão longos quanto o identificador do provedor. A autorização do aplicativo por aproximação padrão deixa uma pessoa escolher o aplicativo nos Ajustes como o padrão por aproximação.

Cada uma das três páginas aponta para o mesmo lugar, um formulário de pedido para transações por aproximação baseadas em emulação de cartão pelo host, para aplicativos bancários e de carteira no Espaço Econômico Europeu. O lado comercial disso está coberto pela página da emulação no iPhone; a consequência técnica é que o código abaixo só roda onde a Apple disse sim.

Duas conferências antes de qualquer coisa aparecer

A Apple pede três valores antes de uma sessão ser criada: NFCReaderSession.readingAvailable, CardSession.isSupported para o aparelho, e CardSession.isEligible para o ambiente atual, que é assíncrono. A referência é explícita sobre por que cada um importa: criar uma sessão num aparelho não suportado levanta um erro fatal, e num ambiente não elegível mostraria uma interface de sessão de cartão do sistema à toa.

Então a conferência fica antes do botão, não depois dele. Um aplicativo que se oferece para apresentar um cartão e depois falha no teste de elegibilidade já prometeu algo que o sistema não vai entregar.

A sessão, evento por evento

Uma sessão de cartão é um fluxo em vez de um delegado. O aplicativo a cria, percorre eventStream, e recebe sessionStarted assim que o aplicativo detém o recurso NFC, depois readerDetected quando o aparelho percebe o campo de um leitor.

A emulação começa quando o aplicativo chama startEmulation(), que apresenta a interface modal do sistema, com alertMessage posta de antemão. Daí em diante cada evento carrega uma carga útil APDU a processar e a responder com respond(response:), e a Apple avisa que um leitor pode tratar uma resposta atrasada como um tempo esgotado. readerDeselected chega quando o leitor vai embora, stopEmulation(status:) fecha a interface de rádio com um estado final mostrado ao usuário, e invalidate() libera a sessão.

startEmulation() lança onde a plataforma recusa: o sistema não está disponível, o acesso não foi aceito, a elegibilidade falhou, ou o rádio está desligado. Esses quatro casos merecem mensagens distintas, já que só um deles é um problema que o usuário consegue resolver.

Que aplicativo um toque alcança

O aplicativo por aproximação padrão responde a um toque a menos que outro aplicativo peça o campo. NFCPresentmentIntentAssertion é esse pedido: adquirida do primeiro plano, ela impede o aplicativo padrão do sistema de ser lançado em resposta a um gesto ou ao campo de um leitor, e a Apple a prende a uma pessoa escolhendo ativamente uma credencial no seu aplicativo.

Ela não dura. A asserção expira quando o objeto é desinicializado, quando o aplicativo vai para segundo plano, ou depois de quinze segundos, e uma nova só pode ser adquirida depois de um intervalo de espera de quinze segundos. Ela também não é exigida antes de apresentar a interface.

O Android arranja a mesma questão de outro jeito, com um papel de carteira e uma preferência de primeiro plano que qualquer aplicativo pode usar; a página do encaminhamento cobre isso. As plataformas concordam num ponto: o usuário, e não o leitor, decide que aplicativo fala.

Perguntas frequentes

Qualquer aplicativo iOS consegue emular um cartão?

Não. A autorização de sessão de cartão é concedida mediante pedido sob um acordo com a Apple, e criar uma sessão sem ela levanta um erro fatal.

Que transações a Apple lista?

Pagamentos em loja, chaves de carro, transporte de circuito fechado, crachás corporativos, chaves de hotel, fidelidade e bilhetes de evento, no Espaço Econômico Europeu.

O usuário vê alguma coisa durante a emulação?

Vê. Começar a emulação apresenta uma interface modal do sistema, e o texto dentro dela é a mensagem de alerta que o aplicativo põe de antemão.

Quanto dura uma asserção de intenção de apresentação?

Quinze segundos, ou até o aplicativo sair do primeiro plano ou o objeto ser desinicializado, e uma nova espera um intervalo de quinze segundos.