O estado do NEVPNManager é inválido até as preferências carregarem
Ler o estado ou guardar antes de loadFromPreferences terminar dá resultados desatualizados ou falhados. A ordem de carregamento, as referências do porta-chaves e os grupos de acesso decidem isso.
Reinicie a aplicação, pergunte ao gestor pelo estado da ligação e ele reporta desligado enquanto o menu do sistema mostra claramente um túnel ativo. Ou uma chamada de gravação devolve um erro que não explica nada, ou um segredo partilhado é declarado em falta segundos depois de ter sido atribuído. Três sintomas, um só mecanismo: o gestor é uma vista sobre um armazém do sistema, e uma vista lê-se vazia até alguém a carregar.
Antes de depurar qualquer disto, decida que API deve usar. Um túnel IPsec ou IKEv2 do sistema encaixa no gestor integrado; um protocolo que o sistema não implementa exige um fornecedor de túnel com o seu próprio tratamento de pacotes, e nenhuma combinação de campos muda isso.
O gestor é uma vista sobre um armazém
Crie ou obtenha o gestor, peça-lhe que carregue as suas preferências e deixe o controlador de conclusão terminar antes de ler o estado ou alterar definições do protocolo. Quando a tarefa é enumerar configurações guardadas, use a chamada de todas as variantes em vez de reutilizar uma única instância para dois fins. Antes de a carga chegar, o estado costuma ser inválido, e mapear inválido para desligado é precisamente o erro que faz uma aplicação parecer errada só depois de reiniciar.
A escrita segue a mesma ordem. Uma gravação tentada num gestor que nunca carregou nada pode falhar sem uma mensagem útil, porque não existe nenhuma identidade guardada à qual aplicar a alteração. Carregue, modifique, guarde e depois volte a ler o estado. O objeto ao qual o sistema se liga é o perfil guardado, não o que estava a editar em memória.
As alterações de estado só chegam enquanto observa
Depois de as preferências carregarem, o estado passa por desligado, a ligar, ligado, a reafirmar e a desligar. Inicialize a interface com uma única leitura e depois escute a notificação de alteração em vez de sondar com um temporizador. A sondagem funciona em primeiro plano e mente em segundo plano, e é assim que as aplicações ficam com um indicador que nunca se resolve.
As notificações só chegam enquanto a aplicação está em primeiro plano. Tudo o que mantém estado em segundo plano parecerá desatualizado após um reinício, por isso atualize no arranque e novamente quando a aplicação volta ao primeiro plano. Se um fornecedor é dono do túnel, conduza-o através do objeto de sessão correspondente; a propriedade de ligação simples não modela o ciclo de vida de um fornecedor.
Os segredos são referências, não cadeias
Um relatório de segredo partilhado em falta raramente significa que ninguém atribuiu um. O objeto de protocolo quer uma referência: uma para a palavra-passe do utilizador e uma para a chave pré-partilhada do IPsec. Passar nil, ou uma referência derivada da entrada errada do porta-chaves, produz a mesma queixa que um espaço vazio. O erro nomeia o sintoma e esconde a causa, e é por isso que as pessoas voltam a introduzir o mesmo segredo várias vezes.
Escreva primeiro o segredo como item de palavra-passe genérica e depois leia uma referência persistente para ele. Uma referência persistente sobrevive a um reinício, ao contrário de um ponteiro em memória, e é a representação que o perfil serializa. Escolha uma classe de acessibilidade que ainda permita o acesso depois de o dispositivo estar desbloqueado, senão um túnel que tem de se reconectar num ecrã bloqueado falhará a autenticação com um segredo perfeitamente válido.
A extensão tem a sua própria vista do porta-chaves
Uma extensão de rede é um processo separado, por isso o acesso predefinido da aplicação ao porta-chaves não chega até ela. Dê aos dois alvos o mesmo grupo de acesso ao porta-chaves nos seus direitos, guarde o item uma vez dentro desse grupo e deixe cada processo lê-lo. Sem o grupo, a extensão não encontra nada e reporta uma falha de credenciais que a aplicação não consegue reproduzir.
Se o fornecedor é configurado através do seu objeto de configuração de fornecedor, não incorpore também o segredo dentro da aplicação. Duas cópias divergem, e a divergência apresenta-se como credenciais erradas e não como duplicação. Um widget ou um segundo processo que reporte outro estado tem a mesma explicação: cada um precisa do grupo e cada um tem de carregar as preferências antes de ler.
Faça corresponder a API ao protocolo
O gestor integrado transporta objetos de protocolo IPsec e IKEv2. Não se transforma num cliente SSL VPN genérico através de campos adicionais, e um perfil desajustado pode guardar-se sem erros e mesmo assim nunca ligar. Decida a que categoria pertence antes de investigar o estado, porque um erro de estado e um protocolo não suportado parecem idênticos vistos de fora.
Para o próximo reinício, a lista de verificação é curta: carregue as preferências, leia o estado, mantenha as subscrições de alterações em primeiro plano, reconstrua as referências a partir do grupo partilhado e confirme que o objeto de protocolo corresponde à API que implementou. Percorrer essa lista leva um minuto; adivinhá-la leva uma tarde.