NEVPNManager neukladá? Poradie je načítať, povoliť, uložiť, pripojiť
Kódy 4 a 5 zvyčajne znamenajú, že profil sa upravil pred načítaním alebo uložil, keď bol zakázaný. Opravte poradie volaní a potom skontrolujte oprávnenie.
Dva chybové kódy vysvetľujú väčšinu prvých pokusov o Network Extension VPN v iOS: NEVPNErrorDomain Code=4 a Code=5. Ani jeden nie je sťažnosť servera. Jeden sa objaví, keď aplikácia zapisuje nastavenia do objektu, ktorý sa nikdy neprečítal z disku, a druhý, keď samotný zápis zlyhá, najčastejšie preto, že sa profil ukladá, kým je ešte zakázaný. Oba sa opravujú zmenou poradia štyroch volaní, nie zásahom do parametrov IKEv2.
Najprv načítajte, inak nemá uloženie s čím porovnávať
Správca drží kópiu uloženého profilu a objekt, ktorý upravujete, nie je tou kópiou, kým ho neprečítate. Najprv zavolajte loadFromPreferences, upravujte vnútri jeho obsluhy dokončenia a potom uložte. Ak čítanie preskočíte, rámec vidí nesúlad medzi tým, čo má, a tým, čo píšete. V Swift je tvar rovnaký pri každom kroku a každý krok patrí do vlastného 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
}
}
Spustenie tunela zvnútra closure na uloženie je tá istá chyba na inom mieste. Beží skôr, než sa profil znova prečíta, takže volanie spustenia vidí stav, ktorý ste postavili, a nie stav, ktorý sa uložil. Closure na uloženie končí druhým loadFromPreferences a iba tá obsluha dokončenia volá startVPNTunnel.
Príznak povolenia je súčasťou uloženia
Uložený profil je nečinný, kým sa nezapne. Nastavte isEnabled = true v tom istom zápise, inak profil pristane na disku zakázaný a startVPNTunnel odmietne, aj keď Nastavenia ukazujú konfiguráciu, ktorá vyzerá úplne.
Vonkajšie úpravy sú druhou polovicou. Ak používateľ niečo zmení v Nastaveniach alebo sa zariadenie presunie medzi sieťami, prečítajte znova, kým uveríte hodnotám, ktoré ešte držíte v pamäti. Objekt tieto zmeny za vás nesleduje. Zastaraná kópia je spôsob, akým aplikácia zapíše profil, ktorý ticho vráti používateľovu úpravu. Dve susedné polia spôsobujú tichý problém v ten istý okamih: pravidlá on-demand musia byť pole objektov pravidiel, nie prázdny zástupný prvok, a disconnectOnSleep má odrážať správanie, ktoré ste zvolili, nie skopírovanú predvolenú hodnotu.
Pre aplikácie tretích strán sú dostupné len dva protokoly
Network Extension dáva aplikáciám IPsec a IKEv2. L2TP a PPTP zostávajú vnútri systému, takže aplikácia, ktorá ich potrebuje, ich nemôže mať, a realistické odpovede sú brána s podporou IKEv2 alebo spravovaný konfiguračný profil.
Prihlasovacie údaje sledujú rovnaký vzor. Vložte heslo do Keychain a odovzdajte trvalú referenciu namiesto reťazca. Nulová referencia pri ukladaní zvyčajne znamená, že vyhľadávanie prebehlo skôr, než bola položka zapísaná, nie že je správca pokazený.
Obe sú rozhodnutia o návrhu, nie obchádzky. Aplikácia, ktorá drží heslo vo vlastných predvoľbách, si vyberá cestu, ktorú rámec neodporúča, a zlyhanie, ktoré vytvára, sa číta ako chyba ukladania.
Vylúčte oprávnenie, kým začnete prepisovať kód
Keď loadFromPreferences nikdy nezavolá späť, pravdepodobnou príčinou je chýbajúca schopnosť Network Extension alebo provisionovací profil, ktorý ju nenesie. Také zlyhanie visí namiesto toho, aby hlásilo chybu, a preto sa fungujúci kód prepisuje hodiny. Skontrolujte oprávnenie v podpísanom zostavení, ktoré hodláte dodať, pretože beh v simulátore a na zariadení sa môže líšiť a cieľom, na ktorom záleží, je zariadenie. Otvorte nastavenia podpisovania cieľa a potvrďte, že schopnosť Network Extension je prítomná presne pre toto zostavenie.
Provisionovací profil bez oprávnenia zlyháva na hardvéri rovnako, zatiaľ čo to isté zostavenie sa v simulátore môže načítať normálne. Otestujte podpísaný archív na skutočnom zariadení, kým prepíšete poradie volaní.
Sledujte zmeny stavu, nie predpoklady
Sledujte NEVPNStatusDidChangeNotification a zaznamenávajte manager.connection.status po každom kroku. Stav, ktorý nikdy neopustí invalid, znamená, že profil nebol uložený alebo chýba oprávnenie. Spojenie, ktoré dosiahne connecting a nikdy sa nepripojí, ukazuje na návrh alebo prihlasovacie údaje, a to je iné vyšetrovanie s inými dôkazmi.
Potvrďte, že sa profil objavuje v Nastavenia, Všeobecné, VPN, a zaznamenajte chybu z každého closure. Tieto dve skutočnosti oddeľujú chybu poradia od chyby oprávnení bez hádania.