NEVPNManager не зачувува? Редоследот е вчитај, овозможи, зачувај, поврзи
Кодот 4 и кодот 5 обично значат дека профилот е уреден пред вчитување или зачуван додека бил оневозможен. Поправете го редоследот на повиците, потоа проверете го правото.
Два кода за грешка објаснуваат повеќето први обиди со Network Extension VPN на iOS: NEVPNErrorDomain Code=4 и Code=5. Ниту еден не е жалба од серверот. Едниот се појавува кога апликацијата пишува поставки во објект што никогаш не бил прочитан од дискот, а другиот кога самото пишување не успева, најчесто зашто профилот се зачувува додека е уште оневозможен. Двата се поправаат со промена на редоследот на четири повици, а не со допирање на параметрите на IKEv2.
Прво вчитајте, инаку зачувувањето нема со што да спореди
Менаџерот држи копија од зачуваниот профил, и објектот што го уредувате не е таа копија додека не го прочитате. Прво повикајте loadFromPreferences, уредувајте во неговиот обработувач за завршување, потоа зачувајте. Ако го прескокнете читањето, рамката гледа несовпаѓање меѓу тоа што го има и тоа што го пишувате. Во Swift формата е иста за секој чекор, и секој чекор припаѓа на своето затворање:
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
}
}
Започнувањето на тунелот од внатрешноста на затворањето за зачувување е истата грешка на друго место. Се извршува пред профилот да биде повторно прочитан, па повикот за старт ја гледа состојбата што сте ја изградиле, а не состојбата што е зачувана. Затворањето за зачувување завршува со втор loadFromPreferences, и само тој обработувач за завршување го повикува startVPNTunnel.
Знамето за овозможување е дел од зачувувањето
Зачуваниот профил е инертен додека не се вклучи. Поставете isEnabled = true во истото пишување, инаку профилот слетува на дискот оневозможен и startVPNTunnel одбива дури и кога Поставките покажуваат конфигурација што изгледа целосна.
Надворешните уредувања се другата половина. Ако корисникот промени нешто во Поставките, или уредот се премести меѓу мрежи, прочитајте повторно пред да им верувате на вредностите што сѐ уште ги држите во меморијата. Објектот не ги набљудува тие промени за вас. Застарена копија е начинот на кој апликацијата пишува профил што тивко ја враќа корисничката промена. Две соседни полиња предизвикуваат тивка неволја во истиот момент: правилата on-demand мора да бидат низа од објекти правила, а не празен заменски елемент, а disconnectOnSleep треба да го одразува однесувањето што сте го избрале, а не копирана стандардна вредност.
Само два протоколи се достапни за апликации од трети страни
Network Extension им дава на апликациите IPsec и IKEv2. L2TP и PPTP остануваат внатре во системот, па апликација што ги бара не може да ги добие, а реалистичните одговори се порта со поддршка за IKEv2 или управуван конфигурациски профил.
Пристапните податоци го следат истиот образец. Ставете ја лозинката во Keychain и предадете постојана референца наместо низата. Нулта референца при зачувување обично значи дека пребарувањето се извршило пред ставката да биде запишана, а не дека менаџерот е расипан.
Двете се дизајнерски одлуки, а не заобиколни решенија. Апликација што ја држи лозинката во своите поставки избира пат што рамката не го препорачува, а дефектот што го создава се чита како грешка при зачувување.
Исклучете го правото пред да го препишете кодот
Кога loadFromPreferences воопшто не враќа повик, веројатната причина е недостапна можност Network Extension или профил за подготовка што не ја носи. Тој дефект виси наместо да даде грешка, и затоа код што работи се препишува со часови. Проверете го правото на потпишаната градба што планирате да ја испорачате, бидејќи работењето во симулатор и на уред може да се разликува, а целта што е важна е уредот. Отворете ги поставките за потпишување на целта и потврдете дека можноста Network Extension е присутна за точно таа градба.
Профил за подготовка без правото не успева на ист начин на хардвер, додека истата градба може нормално да се вчита во симулаторот. Тестирајте го потпишаниот архив на вистински уред пред да го препишете редоследот на повиците.
Гледајте ги промените на состојбата, а не претпоставките
Набљудувајте NEVPNStatusDidChangeNotification и запишете manager.connection.status по секој чекор. Состојба што никогаш не излегува од invalid значи дека профилот не е зачуван или правото недостасува. Врска што стигнува до connecting и никогаш не се поврзува упатува на предлогот или пристапните податоци, што е истрага со други докази.
Потврдете дека профилот се појавува под Поставки, Општо, VPN, и запишете ја грешката од секое затворање. Овие два факти без погодување го делат дефектот на редоследот од дефектот на дозволите.