Dve kodi napak pojasnjujeta večino prvih poskusov z VPN Network Extension v iOS: NEVPNErrorDomain Code=4 in Code=5. Nobena ni pritožba strežnika. Eden se pojavi, ko aplikacija piše nastavitve v objekt, ki ni bil nikoli prebran z diska, drugi pa, ko zapis sam ne uspe, najpogosteje zato, ker se profil shranjuje, medtem ko je še onemogočen. Oba se popravita s spremembo vrstnega reda štirih klicev, ne z dotikanjem parametrov IKEv2.

Najprej naložite, sicer shranjevanje nima s čim primerjati

Upravitelj hrani kopijo shranjenega profila in objekt, ki ga urejate, ni ta kopija, dokler je ne preberete. Najprej pokličite loadFromPreferences, urejajte znotraj njegovega obravnavalnika dokončanja in nato shranite. Če branje preskočite, ogrodje vidi neskladje med tem, kar ima, in tem, kar pišete. V Swiftu je oblika enaka pri vsakem koraku in vsak korak pripada svojemu 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
    }
}

Zagon tunela iz notranjosti closure za shranjevanje je ista napaka na drugem mestu. Izvede se, preden se profil znova prebere, zato klic zagona vidi stanje, ki ste ga zgradili, in ne stanja, ki je bilo shranjeno. Closure za shranjevanje se konča z drugim loadFromPreferences in samo ta obravnavalnik dokončanja pokliče startVPNTunnel.

Zastavica omogočitve je del shranjevanja

Shranjen profil je nedejaven, dokler ni vklopljen. Nastavite isEnabled = true v istem zapisu, sicer profil pristane na disku onemogočen in startVPNTunnel zavrne, tudi ko Nastavitve prikazujejo konfiguracijo, ki je videti popolna.

Zunanje spremembe so druga polovica. Če uporabnik kaj spremeni v Nastavitvah ali se naprava premakne med omrežji, znova preberite, preden zaupate vrednostim, ki jih še držite v pomnilniku. Objekt teh sprememb ne opazuje namesto vas. Zastarela kopija je način, kako aplikacija zapiše profil, ki tiho povrne uporabnikovo spremembo. Dve sosednji polji v istem trenutku povzročita tih problem: pravila on-demand morajo biti matrika objektov pravil, ne prazen nadomestni element, in disconnectOnSleep mora odražati vedenje, ki ste ga izbrali, ne kopirane privzete vrednosti.

Aplikacijam tretjih strani sta na voljo samo dva protokola

Network Extension aplikacijam daje IPsec in IKEv2. L2TP in PPTP ostaneta znotraj sistema, zato aplikacija, ki ju potrebuje, ju ne more imeti, realistična odgovora pa sta prehod z podporo IKEv2 ali upravljan konfiguracijski profil.

Poverilnice sledijo istemu vzorcu. Geslo vstavite v Keychain in namesto niza posredujte trajno referenco. Ničelna referenca pri shranjevanju običajno pomeni, da je iskanje poteklo, preden je bila postavka zapisana, ne da je upravitelj pokvarjen.

Oboje so oblikovalske odločitve in ne obvozi. Aplikacija, ki hrani geslo v svojih nastavitvah, izbere pot, ki je ogrodje ne priporoča, in napaka, ki jo ustvari, se bere kot napaka shranjevanja.

Izločite pravico, preden prepišete kodo

Ko loadFromPreferences sploh ne pokliče nazaj, je verjetni vzrok manjkajoča zmožnost Network Extension ali profil za pripravo, ki je ne nosi. Ta napaka visi, namesto da bi vrnila napako, in zato se delujoča koda prepisuje ure. Preverite pravico v podpisani gradnji, ki jo nameravate dostaviti, ker se zagon v simulatorju in na napravi lahko razlikujeta in cilj, ki šteje, je naprava. Odprite nastavitve podpisovanja cilja in potrdite, da je zmožnost Network Extension prisotna za točno to gradnjo.

Profil za pripravo brez pravice spodleti na enak način na strojni opremi, medtem ko se ista gradnja v simulatorju lahko naloži normalno. Preizkusite podpisan arhiv na resnični napravi, preden prepišete vrstni red klicev.

Opazujte spremembe stanja, ne predpostavk

Opazujte NEVPNStatusDidChangeNotification in po vsakem koraku zabeležite manager.connection.status. Stanje, ki nikoli ne zapusti invalid, pomeni, da profil ni bil shranjen ali da pravica manjka. Povezava, ki doseže connecting in se nikoli ne poveže, kaže na predlog ali poverilnice, kar je druga preiskava z drugimi dokazi.

Potrdite, da se profil pojavi pod Nastavitve, Splošno, VPN, in zabeležite napako iz vsakega closure. Ti dve dejstvi brez ugibanja ločita napako vrstnega reda od napake dovoljenj.

Sorodni članki