Два кода грешке објашњавају већину првих покушаја са 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, и забележите грешку из сваког затварања. Те две чињенице без нагађања раздвајају грешку редоследа од грешке дозвола.

Повезани чланци