Due lavori molto diversi finiscono sotto il nome di VPN programmatica, e solo uno dei due è disponibile per un’app ordinaria su entrambe le piattaforme mobili. Il primo è attivare un profilo che l’utente ha già salvato; il secondo è costruire un tunnel dentro il proprio processo. Android ti dà il secondo tramite VpnService e iOS ti dà il secondo tramite l’autorizzazione Network Extension, mentre il primo resta al sistema, al proprietario del dispositivo o a un server MDM. Capire quale ti serve davvero di solito rende il progetto più piccolo.

Due lavori che condividono un nome

Attivare un profilo salvato significa dire a un tunnel esistente di salire: un host, una credenziale, un protocollo, tutto già configurato da qualche parte che l’utente può vedere. Costruire un tunnel significa che il tuo codice possiede l’interfaccia, il ciclo dei pacchetti e il protocollo. Sembrano simili in un backlog di prodotto e quasi non condividono implementazione.

Nessuna delle due piattaforme mobili espone il primo a un’app SDK. Una connessione che compare senza che l’utente faccia nulla è indistinguibile dal malware, perciò entrambi i sistemi mettono un cancello di consenso davanti a ogni app che trasporta traffico.

Android: un cancello di consenso e nessuna API dei profili

VpnService esiste da Android 4.0 e consente a un’app di creare un’interfaccia tun, poi leggere e scrivere pacchetti. Il servizio deve essere dichiarato con BIND_VPN_SERVICE, e VpnService.prepare() produce la finestra di sistema che chiede all’utente di consentirlo. L’esempio della piattaforma, ToyVpn, è l’affermazione più chiara della forma prevista: il tuo codice possiede l’interfaccia e tutto ciò che la attraversa.

Ciò che non fa è aggiungere una voce alla schermata delle impostazioni VPN del sistema. Non esiste un’API pubblica per questo, e l’app Impostazioni tiene i propri profili in un archivio che un’app ordinaria non riesce a raggiungere. Le chiamate alle classi nascoste da un’applicazione normale producono profili che il sistema non elenca mai, per questo il codice che sembrava funzionare su una build smette silenziosamente di funzionare sulla successiva.

La via gestita è separata. Un proprietario del dispositivo o del profilo può designare un pacchetto VPN sempre attivo tramite le API dei criteri del dispositivo, e uno strumento aziendale può inviare un profilo che l’utente poi approva. È autorità di gestione del dispositivo, non un permesso che un’app chiede all’installazione. Se il tuo cliente è un’organizzazione, questa è la via da pianificare; se il tuo cliente è una persona che installa da uno store, non è affatto disponibile.

iOS: l’autorizzazione è il confine

iOS divide lo stesso lavoro in modo diverso. Un client VPN implementa un provider di tunnel di pacchetti o un proxy dell’app nel framework Network Extension, e l’autorizzazione corrispondente deve essere concessa all’account sviluppatore. Una configurazione VPN personale tramite NEVPNManager esiste per il caso più semplice, e continua a girare nello stesso modello di permessi. Apple documenta tutta la superficie nella referenza Network Extension, che vale la pena leggere prima di delimitare il lavoro.

Non esiste un modo supportato per aprire la schermata delle impostazioni VPN, leggere le configurazioni salvate dall’utente o avviarne una. Ciò che un client può fare è distribuire un profilo di configurazione che l’utente installa, e poi usare il tunnel risultante tramite normali chiamate di rete. Il tunnel per app è assegnato da un server MDM tramite una regola su richiesta, non scelto dall’app in fase di esecuzione.

Un client VPN di un grande fornitore non è prova che il tuo account possa distribuire la stessa cosa. Queste autorizzazioni vengono richieste per account sviluppatore ed esaminate, quindi il rischio di calendario sta su Apple, non sul tuo piano di sprint.

Il desktop arriva più lontano, ma la proprietà non cambia

Windows è il caso permissivo. Add-VpnConnection crea una voce della rubrica telefonica da una sessione PowerShell elevata, e rasdial la collega o la scollega da uno script. Un’app può anche pilotare un client del fornitore tramite la sua riga di comando documentata. Creare il profilo resta un’azione amministrativa, perché la voce vive in un archivio a livello di macchina.

macOS si comporta allo stesso modo con altri strumenti. scutil --nc start e stop operano su servizi che esistono già, mentre crearne uno è un compito di amministrazione del sistema. Possedere il processo su un portatile non ti rende proprietario della configurazione.

Cosa costruire invece

Se il requisito reale è che la tua app raggiunga un’API interna, il tunnel che l’utente già esegue basta. Fai richieste HTTPS normali, lascia che il sistema scelga il percorso, e smetti di provare a controllare il tunnel. Se il requisito è che solo il traffico della tua app usi il tunnel, chiedi VPN per app tramite il canale di gestione, o termina TLS dentro l’app contro un servizio raggiungibile senza di esso.

Le API nascoste non sono una scorciatoia che valga la pena. Cambiano tra le versioni, falliscono la revisione delle app, e i guasti che producono sembrano a chi eredita il codice guasti di rete ordinari. Il confronto non è Android contro iOS; è possedere un tunnel contro chiedere alla piattaforma di instradare il traffico, e solo la prima è tua da costruire.

Articoli correlati