Du klaidų kodai paaiškina daugumą pirmųjų bandymų naudojant Network Extension VPN iOS sistemoje: NEVPNErrorDomain Code=4 ir Code=5. Nė vienas nėra serverio skundas. Vienas pasirodo, kai programėlė rašo nustatymus į objektą, kuris niekada nebuvo perskaitytas iš disko, o kitas – kai pats įrašymas nepavyksta, dažniausiai todėl, kad profilis išsaugomas, kai jis dar išjungtas. Abu ištaisomi pakeitus keturių iškvietimų tvarką, o ne liečiant IKEv2 parametrus.

Pirmiausia įkelkite, kitaip išsaugojimui nėra su kuo palyginti

Valdytojas laiko išsaugoto profilio kopiją, ir objektas, kurį redaguojate, nėra ta kopija, kol jos neperskaitysite. Pirmiausia iškvieskite loadFromPreferences, redaguokite jo užbaigimo apdorotojo viduje, tada išsaugokite. Jei praleisite skaitymą, karkasas matys neatitikimą tarp to, ką turi, ir to, ką rašote. Swift kalboje forma ta pati kiekviename žingsnyje, ir kiekvienas žingsnis priklauso savo uždariui:

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

Tunelio paleidimas iš išsaugojimo uždario vidaus yra ta pati klaida kitoje vietoje. Jis vykdomas prieš tai, kai profilis perskaitomas iš naujo, todėl paleidimo iškvietimas mato jūsų sukurtą būseną, o ne išsaugotą. Išsaugojimo uždarys baigiasi antru loadFromPreferences, ir tik tas užbaigimo apdorotojas kviečia startVPNTunnel.

Įjungimo vėliavėlė yra išsaugojimo dalis

Išsaugotas profilis neveikia, kol neįjungiamas. Nustatykite isEnabled = true tame pačiame įraše, kitaip profilis atsidurs diske išjungtas ir startVPNTunnel atsisakys, net jei Nustatymai rodo visiškai atrodančią konfigūraciją.

Išoriniai pakeitimai yra kita pusė. Jei naudotojas ką nors pakeičia Nustatymuose arba įrenginys persikelia tarp tinklų, perskaitykite iš naujo prieš pasitikėdami reikšmėmis, kurias dar laikote atmintyje. Objektas tų pakeitimų už jus nestebi. Pasenusi kopija yra būdas, kuriuo programėlė įrašo profilį, kuris tyliai grąžina naudotojo pakeitimą. Du gretimi laukai tuo pačiu metu sukelia tylią bėdą: on-demand taisyklės turi būti taisyklių objektų masyvas, o ne tuščias pakaitinis žymeklis, o disconnectOnSleep turi atspindėti jūsų pasirinktą elgseną, o ne nukopijuotą numatytąją reikšmę.

Trečiųjų šalių programėlėms prieinami tik du protokolai

Network Extension suteikia programėlėms IPsec ir IKEv2. L2TP ir PPTP lieka sistemos viduje, todėl programėlė, kuriai jų reikia, jų negaus, o realūs atsakymai yra IKEv2 palaikanti tinklo sąsaja arba valdomas konfigūracijos profilis.

Prisijungimo duomenys laikosi to paties modelio. Įdėkite slaptažodį į Keychain ir perduokite nuolatinę nuorodą, o ne eilutę. Nulinė nuoroda išsaugant paprastai reiškia, kad paieška įvyko prieš įrašant elementą, o ne kad valdytojas sugedęs.

Abu yra dizaino sprendimai, o ne apėjimo būdai. Programėlė, kuri laiko slaptažodį savo nuostatose, renkasi kelią, kurio karkasas nerekomenduoja, o jos sukeliama klaida skaitoma kaip išsaugojimo klaida.

Pašalinkite teisę prieš perrašydami kodą

Kai loadFromPreferences visiškai negrąžina iškvietimo, tikėtina priežastis yra trūkstama Network Extension galimybė arba parengimo profilis, kuris jos neturi. Ta klaida pakimba vietoj to, kad duotų klaidą, ir todėl veikiantis kodas perrašomas valandų valandas. Patikrinkite teisę pasirašytame kūrinyje, kurį ketinate išleisti, nes paleidimas simuliatoriuje ir įrenginyje gali skirtis, o svarbus tikslas yra įrenginys. Atidarykite tikslo pasirašymo nustatymus ir patvirtinkite, kad Network Extension galimybė yra būtent tam kūriniui.

Parengimo profilis be teisės taip pat nepavyksta techninėje įrangoje, o tas pats kūrinys simuliatoriuje gali įsikelti normaliai. Išbandykite pasirašytą archyvą tikrame įrenginyje prieš perrašydami iškvietimų tvarką.

Stebėkite būsenos pokyčius, o ne prielaidas

Stebėkite NEVPNStatusDidChangeNotification ir po kiekvieno žingsnio registruokite manager.connection.status. Būsena, kuri niekada nepalieka invalid, reiškia, kad profilis nebuvo išsaugotas arba trūksta teisės. Ryšys, kuris pasiekia connecting ir niekada neprisijungia, nurodo į pasiūlymą arba prisijungimo duomenis, o tai yra kitas tyrimas su kitais įrodymais.

Patvirtinkite, kad profilis rodomas skiltyje Nustatymai, Bendra, VPN, ir užrašykite klaidą iš kiekvieno uždario. Šie du faktai be spėlionių atskiria tvarkos klaidą nuo leidimų klaidos.

Susiję straipsniai