Kad gradite VPN zaslon unutar iOS aplikacije, prvo iznenađenje je da popis protokola u aplikaciji Postavke nije popis API-ja. Okvir Network Extension dopušta vašoj aplikaciji stvaranje jedne osobne VPN konfiguracije, u vlasništvu te aplikacije, i prihvaća samo nekoliko protokolnih objekata. Sve ostalo što ljudi očekuju, od L2TP-a do preuzetog profila, nalazi se izvan te površine ili je Appleovo privatno. Pogreške koje slijede obično nisu bugovi, to API odbija posao koji mu nikada nije dan.

Mit: API je uređivač Postavki

Vjeruje se da, budući da iOS može konfigurirati profile IKEv1, IKEv2, L2TP i IPsec, aplikacija može programski stvoriti bilo koji od njih. Ne može. Okvir izlaže točno jedno mjesto konfiguracije aplikaciji koja ga poziva, a to mjesto prihvaća samo mali skup javnih protokolnih razreda. Sve ostalo što ljudi očekuju, od L2TP-a do preuzetog profila, nalazi se izvan te površine ili je Appleovo privatno.

Pogreške koje slijede obično nisu bugovi. To API odbija posao koji mu nikada nije dan, a rješenje je dizajnirati zaslon oko onoga što API posjeduje.

Tri protokolna objekta i oni koji ne postoje

Vaše su opcije IKEv1 preko NEVPNProtocolIPSec, IKEv2 preko NEVPNProtocolIKEv2 i NETunnelProviderProtocol ako isporučujete vlastito proširenje paketnog tunela. Referenca NEVPNManager navodi prihvaćene protokolne objekte. L2TP i PPTP nikad se ne pojavljuju na tom popisu jer Apple nije objavio razrede za njih. Pokušaj bilo kojeg od njih završava pri spremanju s pogreškom ili, još gore, s konfiguracijom koju sustav tiho odbija koristiti.

Desktop kod slijedi druga pravila. Na macOS-u SCNetworkInterfaceCreateWithInterface slaže tip sučelja poput L2TP-a preko IPv4 i pridružuje ga mrežnoj usluzi, a networksetup -connectpppoeservice pokreće rezultat. Potrebna su administratorska prava i pomoćni alat jer zajednička tajna i zaporka idu u sustavni privjesak ključeva. Kopirajte taj dizajn na iOS i ništa se ne kompilira.

Proslijedite referencu privjeska ključeva, ne zaporku

Nijedan IKE razred ne prihvaća zaporku kao tekst. Dva svojstva passwordReference i sharedSecretReference žele trajnu referencu privjeska ključeva, koju dobivate iz SecItemCopyMatching traženjem kSecReturnPersistentRef. Prosljeđivanje podataka stavke ili ubacivanje niza u polje stvara neuspjeh spremanja ili vezu s praznim vjerodajnicama. Referenca je trajna samo onoliko koliko i stavka privjeska ključeva iza nje, zato stavka mora postojati prije sastavljanja konfiguracije. Stvorite je u istoj transakciji kao spremanje i uklanjate cijelu klasu bugova redoslijeda.

Autentifikacija certifikatom ide drugim putem: identityData plus identityDataPassword za PKCS#12 blob. Isporučivanje tog bloba unutar paketa aplikacije navika je prenesena iz oglednog koda, a ne odluka o isporuci, jer zaporka putuje s njim i svaka kopija aplikacije nosi isti identitet.

Pravo i dostupnost uvjetuju sve

Upravitelj možda uopće ne postoji, a razlog je dodjela. Identifikator vaše aplikacije treba mogućnost Network Extension zajedno s pravom za osobni VPN, a profil koji potpisuje build mora nositi oboje.

Preskočite to i zajednička instanca vraća nil ili spremanje ne uspijeva s pogreškom koja nikad ne spominje pravo. Dostupnost je druga vrata. Ciljajte nešto starije od iOS-a 8 i simbol nedostaje tijekom izvođenja, pa je neuspjeh pad ili nil upravitelj, a ne upravitelj bez konfiguracije. Provjerite okruženje izvođenja i pravo prije otklanjanja pogrešaka u svom grafu objekata.

Učitajte, izmijenite, spremite, zatim nadzirite redoslijed na zahtjev

Tretirajte životni ciklus kao učitavanje, izmjenu, spremanje i nikada ne preskačite učitavanje. Dok loadFromPreferences ne završi, upravitelj ne drži ništa i protokolni objekt se ne može čitati ni zamijeniti.

Drugo spremanje zamjenjuje konfiguraciju umjesto da dodaje još jednu, pa nedovršeno spremanje može oštetiti profil koji je radio. Pravila na zahtjev tvore uređeno polje, a taj redoslijed je politika. Stavite pravilo povezivanja bilo gdje prije pravila odspajanja i ručno odspajanje slijedi trenutno ponovno povezivanje, što izgleda kao kvar ali slijedi dokumentiranu evaluaciju.

Premjestite pravilo odspajanja naprijed kad korisnička radnja mora pobijediti. Ono što ostaje izvan kontrole aplikacije jednako je važno. Rute dolaze iz tunela ili poslužiteljske politike, a ne iz postavke koju vi zadajete, pri čemu davatelj paketnog tunela izvještava o njima kad se pokrene. Aplikacija ne može navesti ni uređivati profile koje su instalirale druge aplikacije ili konfiguracijski profili, zato ne obećavajte zaslon koji prikazuje svaki VPN na uređaju.

Povezani članci