Kva NEVPNManager kan lage på iOS (og kva det ikkje kan)
iOS sin VPN-API byggjer éin app-eigd konfigurasjon frå tre protokollklassar. L2TP, PPTP og signerte profilar er ikkje ein del av denne flata.
Når du byggjer ein VPN-skjerm inne i ein iOS-app, er den første overraskinga at protokollista i Innstillingar-appen ikkje er API-lista. Network Extension-rammeverket lèt appen din lage éin personleg VPN-konfigurasjon, eigd av den appen, og han godtek berre nokre få protokollobjekt. Alt anna folk ventar, frå L2TP til ein nedlasta profil, ligg utanfor denne flata eller er Apples private. Feila som følgjer er vanlegvis ikkje feil, det er API-et som nektar ein jobb det aldri fekk.
Myten: API-et er ein Innstillingar-redigering
Ein trur at fordi iOS kan konfigurere IKEv1-, IKEv2-, L2TP- og IPsec-profilar, kan ein app lage kven som helst av dei programmatisk. Det kan han ikkje. Rammeverket eksponerer nøyaktig éin konfigurasjonsplass for appen som kallar, og den plassen godtek berre eit lite sett offentlege protokollklassar. Alt anna folk ventar, frå L2TP til ein nedlasta profil, ligg utanfor denne flata eller er Apples private.
Feila som følgjer er vanlegvis ikkje feil. Det er API-et som nektar ein jobb det aldri fekk, og løysinga er å utforme skjermen rundt det API-et eig.
Tre protokollobjekt og dei som ikkje finst
Vala dine er IKEv1 via NEVPNProtocolIPSec, IKEv2 via NEVPNProtocolIKEv2, og NETunnelProviderProtocol om du leverer di eiga pakketunnelutviding. NEVPNManager-referansen listar opp dei godtekne protokollobjekta. L2TP og PPTP viser seg aldri i den lista fordi Apple ikkje publiserte klassar for dei. Å prøve ein av dei endar ved lagring med ein feil, eller verre, med ein konfigurasjon systemet stille nektar å bruke.
Skrivebordskode følgjer andre reglar. På macOS stablar SCNetworkInterfaceCreateWithInterface ein grensesnittleiing som L2TP over IPv4 og knyter han til ein nettverksteneste, og networksetup -connectpppoeservice startar resultatet. Administratorrettar og eit hjelpeverktøy trengst, sidan den delte løyndomen og passordet går inn i systemnøkkelringen. Kopier den designen til iOS, og ingenting vert kompilert.
Send ein nøkkelringreferanse, ikkje passordet
Ingen av dei to IKE-klassane godtek eit passord som tekst. Dei to eigenskapane passwordReference og sharedSecretReference vil ha ein vedvarande nøkkelringreferanse, som du får frå SecItemCopyMatching ved å be om kSecReturnPersistentRef. Å sende elementdataa, eller å presse ein streng inn i feltet, gjev ein lagringsfeil eller ei tilkopling med tomme påloggingsdata. Referansen er berre så varig som nøkkelringselementet bak han, og difor må elementet finnast før konfigurasjonen vert sett saman. Lag det i same transaksjon som lagringa, og du fjernar ein heil klasse rekkjefølgjefeil.
Sertifikatautentisering tek ei anna rute: identityData pluss identityDataPassword for ein PKCS#12-blob. Å levere den bloben i app-pakken er ein vane arva frå eksempelkoden, ikkje ei utgivingavgjerd, fordi passordet reiser med han og kvar kopi av appen ber same identitet.
Rett og tilgjenge portvaktar alt
Handsamaren finst kanskje ikkje i det heile, og årsaka er provisjonering. App-identifikatoren din treng Network Extension-evna saman med retten for personleg VPN, og profilen som signerer bygget må bere begge.
Hopp over det, og den delte instansen returnerer nil, eller lagringa mislukkast med ein feil som aldri nemner retten. Tilgjenge er den andre porten. Retter du deg mot noko eldre enn iOS 8, manglar symbolet ved køyring, så feilen er eit krasj eller ein nil-handsamar, ikkje ein handsamar utan konfigurasjon. Sjekk køyretida og retten før du feilsøkjer objektgrafen din.
Last, endre, lagre, og sjå deretter på rekkjefølgja ved førespurnad
Behandle livssyklusen som last, endre, lagre, og hopp aldri over lastinga. Til loadFromPreferences er fullført, held handsamaren ingenting, og protokollobjektet kan ikkje lesast eller bytast.
Ei ny lagring erstattar konfigurasjonen i staden for å leggje til ei anna, så ei halvferdig lagring kan skade ein profil som verka. Reglar ved førespurnad dannar ein ordna matrise, og den rekkjefølgja er policyen. Set ein kople-til-overalt-regel framfor fråkoplingregelen, og ei manuell fråkopling vert følgd av umiddelbar attilkopling, noko som ser ut som ein defekt men følgjer den dokumenterte vurderinga.
Flytt fråkoplingregelen fram når brukarhandlinga må vinne. Det som ligg utanfor appens kontroll betyr like mykje. Ruter kjem frå tunnelen eller serverpolicyen i staden for frå ei innstilling du set, og ein pakketunelleverandør rapporterer dei når han startar. Appen kan ikkje liste eller redigere profilar installerte av andre apper eller konfigurasjonsprofilar, så ikkje lov ein skjerm som viser kvar VPN på eininga.