Ir para o conteúdo
Idioma: PT

Por que uma sessão do Core NFC termina sozinha?

Porque o sistema a termina, e diz qual de cinco coisas aconteceu: a primeira tag NDEF foi lida, o usuário cancelou, a sessão expirou, o sistema estava ocupado, ou ela terminou de modo inesperado. A sessão não dá para reiniciar depois, então o aplicativo cria uma nova.

Os cinco jeitos de ela terminar

A Apple os agrupa como erros de sessão, e os nomes deles dizem o que aconteceu. readerSessionInvalidationErrorFirstNDEFTagRead chega quando uma sessão criada para ler uma tag a leu. readerSessionInvalidationErrorUserCanceled quer dizer que o usuário dispensou a folha. readerSessionInvalidationErrorSessionTimeout quer dizer que a sessão expirou. readerSessionInvalidationErrorSystemIsBusy quer dizer que o sistema a recusou por razões próprias, e readerSessionInvalidationErrorSessionTerminatedUnexpectedly cobre o resto.

Só um deles é um defeito no seu aplicativo, e em geral é o primeiro: uma sessão criada com invalidateAfterFirstRead em verdadeiro quando o aplicativo queria continuar lendo, o que a página das várias tags desembaraça. Os outros são o sistema e o usuário fazendo o trabalho deles.

O tempo de espera sem número

A Apple documenta o erro e não a duração. Uma sessão que fica aberta sem nada na frente dela termina sozinha, e nenhum valor da referência diz quando, então um aplicativo que lê uma série longa planeja abrir uma sessão nova em vez de supor que a primeira vai durar.

Esse silêncio tem uma consequência prática: a duração não é coisa para fixar no código a partir de uma medição num celular e numa versão. O que o código consegue usar como apoio é o erro chegar, e o que ele faz então.

O que o aplicativo faz em seguida

Uma sessão é de uso único. Uma vez invalidada ela não consegue procurar de novo, então o aplicativo cria uma nova, o que o próprio exemplo de leitor de tag da Apple faz depois de cada invalidação. Qualquer coisa que o aplicativo guardava da sessão antiga, tags incluídas, está vencida.

Diga por quê, quando o usuário consegue agir. invalidate(errorMessage:) termina uma sessão com uma mensagem na folha do sistema, e alertMessage põe o texto durante ela: esses dois são todo o vocabulário que o aplicativo tem dentro da folha, o que a página da folha de leitura descreve do lado do usuário. Uma sessão cancelada não precisa de mensagem alguma; um sistema ocupado merece uma nova tentativa em vez de uma explicação.

O que conferir antes de começar uma

readingAvailable responde se o aparelho consegue ler em absoluto, e a Apple pede aos aplicativos que confiram isso antes de criar uma sessão. readerErrorRadioDisabled existe para um rádio desligado, e readerErrorUnsupportedFeature para um recurso que a sessão não suporta.

E só uma sessão de leitor roda no sistema de cada vez, então uma segunda espera: um aplicativo que começa uma sessão enquanto outra está aberta não falhou, ele está na fila, o que a página das sessões cobre junto com o resto do modelo.

Perguntas frequentes

Dá para reiniciar uma sessão invalidada?

Não. Uma sessão é de uso único: uma vez invalidada ela não consegue procurar de novo, e o aplicativo cria uma nova.

Quanto tempo até uma sessão expirar?

A referência da Apple não dá duração alguma. Trate o erro de expiração e abra uma sessão nova em vez de depender de um valor medido.

Qual invalidação é culpa minha?

Em geral a da primeira tag NDEF lida, quando a sessão foi criada para terminar depois de uma tag e o aplicativo queria continuar lendo.

O que sistema ocupado quer dizer?

O sistema recusou a sessão por razões próprias. Tente uma vez de novo, e avise o usuário só se isso persistir.