O que um aplicativo deve fazer quando o NFC está desligado ou ausente?
Distinga os estados antes de escrever mensagem alguma. No Android: nenhum controlador, um controlador que o usuário desligou, e, a partir do Android 16, tags recusadas para o seu aplicativo. No iPhone: disponível ou não. Depois diga qual deles é, e deixe o resto do aplicativo funcionar.
Três estados no Android
Eles precisam de respostas diferentes, e a página dos limites do controlador os lê em tempo de execução. getDefaultAdapter() devolve nulo quando o celular não tem controlador NFC: o recurso não existe e nunca vai existir nesse aparelho. isEnabled() devolve falso quando o usuário desligou o NFC, que está a um ajuste de ser resolvido. E a partir do Android 16 um usuário consegue recusar as intents de tag para um aplicativo, o que isTagIntentAllowed() informa enquanto o adaptador diz que está ligado.
O terceiro é o que produz os melhores relatos de defeito, porque tudo parece certo: o NFC está ativado, o aplicativo está instalado, o manifesto está correto, e tag alguma chega.
Dois no iPhone
O Core NFC responde antes de uma sessão existir: readingAvailable diz se o aparelho consegue ler. Além disso, os erros carregam o resto, readerErrorRadioDisabled para um rádio desligado e readerErrorUnsupportedFeature para algo que a sessão não consegue fazer.
Não existe equivalente da tela de ajustes do Android para onde mandar o usuário, o que muda a redação em vez de mudar a lógica: um iPhone que não consegue ler é um fato do aparelho, e o trabalho do aplicativo é dizer isso uma vez e seguir adiante. Que iPhones leem em absoluto é a página dos modelos.
O que dizer em cada caso
Sem hardware: esconda o recurso em vez de explicá-lo. Um botão que não consegue funcionar naquele celular é um chamado de suporte esperando, e a ausência dele não precisa de frase alguma.
Desligado: ofereça o ajuste. O Android expõe a tela de ajustes do NFC como uma intent, e mandar o usuário para lá é melhor que descrever onde ela mora, já que o caminho difere por fabricante, o que a página da ativação mostra.
Recusado para o aplicativo: diga isso, porque nada mais na interface vai dizer. O usuário escolheu, possivelmente sem querer, e só a sua mensagem liga o silêncio ao ajuste.
Nunca bloqueie o resto
Um toque é uma entrada entre várias. Um aplicativo que se recusa a começar sem NFC transformou uma comodidade numa exigência, e o usuário que não consegue usá-la é justamente quem precisava da alternativa.
Mantenha o caminho manual: um código a digitar, uma busca, uma leitura, o que quer que a tag estivesse encurtando. E decida em separado se o aplicativo deve sequer ser instalado num celular sem o rádio, que é uma questão de loja em vez de uma questão de execução: a página da loja a retoma.
Perguntas frequentes
Como saber que o celular não tem NFC nenhum?
getDefaultAdapter devolve nulo no Android, e readingAvailable é falso no iOS. Os dois são fatos do aparelho, não ajustes.
Dá para ligar o NFC pelo meu aplicativo?
Não. Dá para mandar o usuário à tela de ajustes do NFC no Android; a chave pertence ao usuário.
Por que nada chega embora o NFC esteja ligado?
A partir do Android 16 o usuário consegue recusar as intents de tag para um aplicativo. isTagIntentAllowed informa isso, e nada mais na interface vai informar.
O aplicativo deve se recusar a rodar sem NFC?
Não. Mantenha o caminho manual e deixe o resto do aplicativo funcionar. Se ele chega a ser instalado é uma decisão separada, de loja.