Dva koda greške objašnjavaju većinu prvih pokušaja Network Extension VPN-a na iOS-u: NEVPNErrorDomain Code=4 i Code=5. Nijedan nije žalba servera. Jedan se pojavljuje kada aplikacija upisuje postavke u objekt koji nikada nije pročitan s diska, a drugi kada sam upis ne uspije, najčešće zato što se profil čuva dok je još onemogućen. Oba se ispravljaju promjenom redoslijeda četiri poziva, a ne diranjem parametara IKEv2.

Prvo učitajte, inače čuvanje nema s čim da uporedi

Menadžer drži kopiju sačuvanog profila, a objekt koji uređujete nije ta kopija dok ga ne pročitate. Prvo pozovite loadFromPreferences, uređujte unutar njegovog rukovaoca završetka, pa sačuvajte. Preskočite li čitanje, okvir vidi nesklad između onoga što ima i onoga što pišete. U Swiftu je oblik isti za svaki korak, a svaki korak pripada svom zatvaranju:

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
    }
}

Pokretanje tunela iz unutrašnjosti zatvaranja za čuvanje ista je greška na drugom mjestu. Izvršava se prije nego što je profil ponovo pročitan, pa poziv za pokretanje vidi stanje koje ste izgradili, a ne stanje koje je sačuvano. Zatvaranje za čuvanje završava drugim loadFromPreferences, i samo taj rukovalac završetka poziva startVPNTunnel.

Zastavica omogućavanja dio je čuvanja

Sačuvani profil je inertan dok se ne uključi. Postavite isEnabled = true u istom upisu, inače profil stigne na disk onemogućen i startVPNTunnel odbija čak i kada Postavke prikazuju konfiguraciju koja izgleda potpuna.

Vanjske izmjene su druga polovina ovoga. Ako korisnik nešto promijeni u Postavkama ili se uređaj premjesti između mreža, ponovo pročitajte prije nego što povjerujete vrijednostima koje još držite u memoriji. Objekt ne opaža te promjene umjesto vas. Zastarjela kopija je način na koji aplikacija upisuje profil koji tiho vraća korisničku izmjenu. Dva susjedna polja stvaraju tihu nevolju u istom trenutku: on-demand pravila moraju biti niz objekata pravila, a ne prazan rezervni element, a disconnectOnSleep treba da odražava ponašanje koje ste odabrali, a ne kopirani podrazumijevani izbor.

Samo dva protokola su dostupna aplikacijama trećih strana

Network Extension daje aplikacijama IPsec i IKEv2. L2TP i PPTP ostaju unutar sistema, pa aplikacija kojoj su potrebni ne može ih dobiti, a realistični odgovori su pristupnik s podrškom za IKEv2 ili upravljani konfiguracijski profil.

Vjerodajnice slijede isti obrazac. Stavite lozinku u Keychain i proslijedite trajnu referencu umjesto niza. Nulta referenca pri čuvanju obično znači da je pretraga pokrenuta prije nego što je stavka upisana, a ne da je menadžer pokvaren.

Oboje su dizajnerske odluke, a ne zaobilazna rješenja. Aplikacija koja drži lozinku u vlastitim postavkama bira put koji okvir ne preporučuje, a kvar koji proizvodi čita se kao greška pri čuvanju.

Isključite ovlaštenje prije nego što prepišete kod

Kada loadFromPreferences uopće ne uzvrati poziv, vjerovatan uzrok je nedostajuća mogućnost Network Extension ili profil za dodjelu koji je ne nosi. Takav kvar visi umjesto da prijavi grešku, i zato se ispravan kod prepisuje satima. Provjerite ovlaštenje u potpisanoj gradnji koju namjeravate isporučiti, jer se pokretanje u simulatoru i na uređaju može razlikovati, a cilj koji je važan jeste uređaj. Otvorite postavke potpisivanja cilja i potvrdite da mogućnost Network Extension postoji za tu tačnu gradnju.

Profil za dodjelu bez ovlaštenja pada na isti način na hardveru, dok se ista gradnja može normalno učitati u simulatoru. Testirajte potpisani arhiv na stvarnom uređaju prije nego što prepišete redoslijed poziva.

Pratite promjene statusa, a ne pretpostavke

Posmatrajte NEVPNStatusDidChangeNotification i bilježite manager.connection.status nakon svakog koraka. Status koji nikada ne napusti invalid znači da profil nije sačuvan ili da ovlaštenje nedostaje. Veza koja stigne do connecting i nikada se ne poveže upućuje na predlog ili vjerodajnice, a to je druga istraga s drugim dokazima.

Potvrdite da se profil pojavljuje pod Postavke, Općenito, VPN, i zabilježite grešku iz svakog zatvaranja. Te dvije činjenice razdvajaju grešku redoslijeda od greške dozvola bez nagađanja.

Povezani članci