Lo stato di NEVPNManager non è valido finché le preferenze non vengono caricate
Leggere lo stato o salvare prima che loadFromPreferences finisca dà risultati obsoleti o falliti. L'ordine di caricamento, i riferimenti al portachiavi e i gruppi di accesso lo decidono.
Riavvia l'app, chiedi al gestore lo stato della connessione e risponde disconnesso mentre il menu di sistema mostra chiaramente un tunnel attivo. Oppure una chiamata di salvataggio restituisce un errore che non spiega nulla, oppure un segreto condiviso viene dichiarato mancante pochi secondi dopo essere stato assegnato. Tre sintomi, un solo meccanismo: il gestore è una vista su un archivio di sistema, e una vista si legge vuota finché qualcuno non la carica.
Prima di fare debug di tutto questo, stabilisci quale API devi usare. Un tunnel IPsec o IKEv2 di sistema si adatta al gestore integrato; un protocollo che il sistema non implementa richiede un provider di tunnel con la tua gestione dei pacchetti, e nessuna combinazione di campi cambia questo.
Il gestore è una vista su un archivio
Crea o recupera il gestore, chiedigli di caricare le sue preferenze e lascia che l'handler di completamento finisca prima di leggere lo stato o modificare le impostazioni del protocollo. Quando il compito è enumerare le configurazioni salvate, usa la chiamata di tutte le varianti invece di riutilizzare una singola istanza per due scopi. Prima che il caricamento arrivi, lo stato è di solito non valido, e convertire non valido in spento è proprio il bug che fa sembrare sbagliata un'app solo dopo un riavvio.
La scrittura segue lo stesso ordine. Un salvataggio tentato su un gestore che non ha mai caricato nulla può fallire senza un messaggio utile, perché non esiste un'identità archiviata a cui applicare la modifica. Carica, modifica, salva, poi leggi di nuovo lo stato. L'oggetto a cui il sistema si connette è il profilo salvato, non quello che stavi modificando in memoria.
I cambi di stato arrivano solo mentre guardi
Una volta caricate le preferenze, lo stato passa per disconnesso, connessione, connesso, riaffermazione e disconnessione. Inizializza l'interfaccia con una sola lettura, poi ascolta la notifica di cambiamento invece di interrogare con un timer. L'interrogazione funziona in primo piano e mente in background, ed è così che le app finiscono con un indicatore che non si risolve mai.
Le notifiche arrivano solo mentre l'app è in primo piano. Qualsiasi cosa mantenga lo stato in background apparirà obsoleta dopo un riavvio, quindi aggiorna all'avvio e di nuovo quando l'app torna in primo piano. Se un provider possiede il tunnel, guidalo tramite l'oggetto sessione corrispondente; la proprietà di connessione semplice non modella il ciclo di vita di un provider.
I segreti sono riferimenti, non stringhe
Una segnalazione di segreto condiviso mancante raramente significa che nessuno ne abbia assegnato uno. L'oggetto protocollo vuole un riferimento: uno per la password utente e uno per la chiave precondivisa IPsec. Passare nil, o un riferimento derivato dalla voce sbagliata del portachiavi, produce la stessa lamentela di uno slot vuoto. L'errore nomina il sintomo e nasconde la causa, per questo le persone reinseriscono lo stesso segreto più volte.
Scrivi prima il segreto come elemento di password generico, poi rileggi un riferimento persistente ad esso. Un riferimento persistente sopravvive al riavvio, a differenza di un puntatore in memoria, ed è la rappresentazione che il profilo serializza. Scegli una classe di accessibilità che consenta ancora l'accesso dopo lo sblocco del dispositivo, altrimenti un tunnel che deve riconnettersi a schermo bloccato fallirà l'autenticazione con un segreto perfettamente valido.
L'estensione ha la propria vista del portachiavi
Un'estensione di rete è un processo separato, quindi l'accesso predefinito dell'app al portachiavi non la raggiunge. Assegna a entrambi i target lo stesso gruppo di accesso al portachiavi nei loro entitlement, archivia l'elemento una volta dentro quel gruppo e lascia che ogni processo lo legga. Senza il gruppo, l'estensione non trova nulla e segnala un errore di credenziali che l'app non può riprodurre.
Se il provider è configurato tramite il suo oggetto di configurazione, non incorporare anche il segreto dentro l'app. Due copie divergono, e la divergenza si presenta come credenziali sbagliate invece che come duplicazione. Un widget o un secondo processo che segnala un altro stato ha la stessa spiegazione: ognuno ha bisogno del gruppo, e ognuno deve caricare le preferenze prima di leggere.
Fai corrispondere l'API al protocollo
Il gestore integrato porta oggetti protocollo IPsec e IKEv2. Non diventa un client SSL VPN generico grazie a campi aggiuntivi, e un profilo inadatto può salvarsi senza errori e comunque non connettersi mai. Decidi in quale categoria rientri prima di indagare sullo stato, perché un bug di stato e un protocollo non supportato sembrano identici dall'esterno.
Per il prossimo riavvio la lista di controllo è breve: carica le preferenze, leggi lo stato, mantieni le sottoscrizioni ai cambiamenti in primo piano, ricostruisci i riferimenti dal gruppo condiviso e conferma che l'oggetto protocollo corrisponda all'API che hai implementato. Percorrere quella lista richiede un minuto; indovinarla richiede un pomeriggio.