Dos codis d'error expliquen la majoria de primers intents d'una VPN Network Extension a l'iOS: NEVPNErrorDomain Code=4 i Code=5. Cap dels dos no és una queixa del servidor. Un apareix quan l'aplicació escriu paràmetres en un objecte que mai no s'ha llegit del disc, i l'altre quan falla la mateixa escriptura, sovint perquè el perfil es desa mentre encara està desactivat. Tots dos es corregeixen canviant l'ordre de quatre crides, no tocant els paràmetres d'IKEv2.

Primer carregueu, o el desat no té amb què comparar

El gestor guarda una còpia del perfil desat, i l'objecte que editeu no és aquella còpia fins que el llegiu. Crideu loadFromPreferences primer, editeu dins del seu gestor de finalització i després deseu. Si us salteu la lectura, el marc veu una discrepància entre el que té i el que escriviu. A Swift la forma és la mateixa a cada pas, i cada pas pertany al seu propi closure:

let mgr = NEVPNManager.shared()
mgr.loadFromPreferences { loadErr in
    guard loadErr == nil else { return }
    let proto = NEVPNProtocolIKEv2()
    proto.serverAddress = "vpn.example.net"
    proto.username = "alice"
    proto.useExtendedAuthentication = true
    mgr.protocolConfiguration = proto
    mgr.isEnabled = true
    mgr.saveToPreferences { saveErr in
        // do not start here; reload, then connect
    }
}

Iniciar el túnel des de dins del closure de desat és el mateix error en un altre lloc. S'executa abans que el perfil s'hagi tornat a llegir, així que la crida d'inici veu l'estat que heu construït i no l'estat que s'ha desat. El closure de desat acaba amb un segon loadFromPreferences, i només aquell gestor de finalització crida startVPNTunnel.

El senyal d'activació forma part del desat

Un perfil desat és inerte fins que s'encén. Definiu isEnabled = true a la mateixa escriptura, o el perfil arriba al disc desactivat i startVPNTunnel es nega encara que Configuració mostri una configuració que sembla completa.

Les edicions externes són l'altra meitat d'això. Si l'usuari canvia alguna cosa a Configuració, o el dispositiu es mou entre xarxes, torneu a llegir abans de confiar en els valors que encara teniu en memòria. L'objecte no observa aquests canvis per vosaltres. Una còpia obsoleta és com una aplicació escriu un perfil que reverteix silenciosament l'edició de l'usuari. Dos camps adjacents causen problemes silenciosos al mateix moment: les regles on-demand han de ser una matriu d'objectes de regla i no un marcador buit, i disconnectOnSleep ha de reflectir el comportament que heu triat i no un valor predeterminat copiat.

Només dos protocols estan disponibles per a aplicacions de tercers

Network Extension dona a les aplicacions IPsec i IKEv2. L2TP i PPTP es queden dins del sistema, així que una aplicació que els necessiti no els pot tenir, i les respostes realistes són una passarel·la compatible amb IKEv2 o un perfil de configuració gestionat.

Les credencials segueixen el mateix patró. Poseu la contrasenya al Keychain i passeu una referència persistent en lloc de la cadena. Una referència nul·la en desar sol significar que la cerca es va executar abans que s'escrivís l'element, no que el gestor estigui trencat.

Totes dues són decisions de disseny i no solucions improvisades. Una aplicació que guarda la contrasenya a les seves pròpies preferències tria un camí que el marc no afavoreix, i la fallada que produeix es llegeix com un error de desat.

Descarteu el dret abans de reescriure codi

Quan loadFromPreferences no torna mai la crida, la causa probable és una capacitat Network Extension absent o un perfil de subministrament que no la porta. Aquesta fallada es penja en lloc de donar error, i per això es reescriu codi que funciona durant hores. Reviseu el dret a la compilació signada que voleu publicar, perquè una execució al simulador i una al dispositiu poden diferir i l'objectiu que importa és el dispositiu. Obriu la configuració de signatura de l'objectiu i confirmeu que la capacitat Network Extension hi és per a aquella compilació exacta.

Un perfil de subministrament sense el dret falla de la mateixa manera al maquinari, mentre que la mateixa compilació pot carregar-se normalment al simulador. Proveu l'arxiu signat en un dispositiu real abans de reescriure l'ordre de les crides.

Observeu els canvis d'estat, no les suposicions

Observeu NEVPNStatusDidChangeNotification i registreu manager.connection.status després de cada pas. Un estat que no surt mai d'invalid vol dir que el perfil no s'ha desat o que el dret és absent. Una connexió que arriba a connecting i no es connecta mai apunta a la proposta o a les credencials, que és una investigació diferent amb proves diferents.

Confirmeu que el perfil apareix a Configuració, General, VPN, i registreu l'error de cada closure. Aquests dos fets separen un error d'ordre d'un error de permisos sense endevinar.

Articles relacionats