Kion NEVPNManager povas krei en iOS (kaj kion ĝi ne povas)
La iOS-VPN-API konstruas unu aplikaĵan agordon el tri protokolaj klasoj. L2TP, PPTP kaj subskribitaj profiloj ne apartenas al tiu surfaco.
Konstruu VPN-ekranon ene de iOS-a aplikaĵo kaj la unua surprizo estas, ke la protokola listo en la aplikaĵo Agordoj ne estas la API-listo. La kadro Network Extension permesas al via aplikaĵo krei unu personan VPN-agordon, posedatan de tiu aplikaĵo, kaj ĝi akceptas nur kelkajn protokolajn objektojn. Ĉio alia, kion homoj atendas, de L2TP ĝis elŝutita profilo, kuŝas ekster tiu surfaco aŭ estas privata de Apple. La malsukcesoj, kiuj sekvas, kutime ne estas cimoj: la API rifuzas taskon, kiun ĝi neniam ricevis.
La mito: la API ne estas redaktilo de Agordoj
La kredo estas, ke ĉar iOS povas agordi profilojn IKEv1, IKEv2, L2TP kaj IPsec, aplikaĵo povas krei iun ajn el ili programe. Ĝi ne povas. La kadro elmetas ekzakte unu agordan fenestreton al la vokanta aplikaĵo, kaj tiu fenestreto akceptas malgrandan aron da publikaj protokolaj klasoj. Ĉio alia, kion homoj atendas, de L2TP ĝis elŝutita profilo, kuŝas ekster tiu surfaco aŭ estas privata de Apple.
La malsukcesoj, kiuj sekvas, kutime ne estas cimoj. Ili estas la API, kiu rifuzas taskon, kiun ĝi neniam ricevis, kaj la solvo estas desegni la ekranon ĉirkaŭ tio, kion la API posedas.
Tri protokolaj objektoj kaj tiuj, kiuj ne ekzistas
Viaj elektoj estas IKEv1 per NEVPNProtocolIPSec, IKEv2 per NEVPNProtocolIKEv2, kaj NETunnelProviderProtocol se vi liveras propran pakaĵtunelan etendaĵon. La referenco de NEVPNManager listigas la akceptatajn protokolajn objektojn. L2TP kaj PPTP neniam aperas en tiu listo, ĉar Apple ne publikigis klasojn por ili. Provante iun ajn el ili, la afero finiĝas ĉe konservado per eraro, aŭ pli malbone, per agordo, kiun la sistemo silente rifuzas uzi.
La komputila kodo sekvas aliajn regulojn. En macOS, SCNetworkInterfaceCreateWithInterface stakigas interfacan tipon kiel L2TP super IPv4 kaj alfiksas ĝin al reta servo, kaj networksetup -connectpppoeservice startigas la rezulton. Necesas administraj rajtoj kaj helpilo, ĉar la komuna sekreto kaj pasvorto iras en la sisteman ŝlosilĉenon. Kopiu tiun dezajnon al iOS kaj nenio kompiliĝas.
Transdonu ŝlosilĉenan referencon, ne la pasvorton
Neniu el la IKE-klasoj akceptas pasvorton kiel tekston. La du ecoj passwordReference kaj sharedSecretReference volas daŭran ŝlosilĉenan referencon, kiun vi ricevas de SecItemCopyMatching petante kSecReturnPersistentRef. Transdoni la datumojn de la ero aŭ trudi ĉenon en la kampon produktas konservan malsukceson aŭ konekton kun malplenaj legitimiloj. La referenco estas nur tiom daŭra, kiom la ŝlosilĉena ero malantaŭ ĝi, do la ero devas ekzisti antaŭ ol la agordo estas kunmetita. Kreu ĝin en la sama transakcio kiel la konservado kaj vi forigas tutan klason da ordigaj cimoj.
Atestila aŭtentikigo prenas alian vojon: identityData plus identityDataPassword por PKCS#12-blobo. Liveri tiun blobon ene de la aplikaĵa pakaĵo estas kutimo portita el ekzempla kodo, ne decido por eldono, ĉar la pasvorto vojaĝas kun ĝi kaj ĉiu kopio de la aplikaĵo portas la saman identecon.
La rajtigo kaj la havebleco decidas ĉion
La administrilo eble tute ne ekzistas, kaj la kialo estas provizado. Via aplikaĵa identigilo bezonas la kapablon Network Extension kune kun la rajtigo por persona VPN, kaj la profilo, kiu subskribas la konstruon, devas porti ambaŭ.
Preterlasu tion kaj la komuna kazo redonas nil, aŭ la konservado malsukcesas per eraro, kiu neniam mencias rajtigon. Havebleco estas la alia pordego. Celu ion pli malnovan ol iOS 8 kaj la simbolo mankas dum plenumo, do la malsukceso estas kraŝo aŭ administrilo kun valoro nil anstataŭ administrilo sen agordo. Kontrolu la plenuman medion kaj la rajtigon antaŭ ol sencimigi vian objektografon.
Ŝargu, ŝanĝu, konservu, kaj poste atentu la mendan ordon
Traktu la vivciklon kiel ŝargi, ŝanĝi, konservi, kaj neniam preterlasu la ŝargon. Ĝis loadFromPreferences finiĝos, la administrilo tenas nenion kaj la protokola objekto ne povas esti legata aŭ anstataŭigata.
Dua konservado anstataŭigas la agordon anstataŭ aldoni alian, do duone finita konservado povas difekti profilon, kiu funkciis. Mendaj reguloj formas ordigitan tabelon, kaj tiu ordo estas la politiko. Metu regulon konekti de ĉie antaŭ la malkonekta regulo kaj mana malkonekto estas sekvata de tuja rekonekto, kio aspektas kiel difekto sed sekvas la dokumentitan taksadon.
Movu la malkonektan regulon antaŭen kiam la ago de la uzanto devas venki. Kio restas ekster la kontrolo de la aplikaĵo same gravas. La itineraj vojoj venas de la tunelo aŭ de la servila politiko, ne de prefero, kiun vi starigas, kaj pakaĵtunela provizanto raportas ilin kiam ĝi startas. La aplikaĵo ne povas listigi aŭ redakti profilojn instalitajn de aliaj aplikaĵoj aŭ agordaj profiloj, do ne promesu ekranon, kiu montras ĉiun VPN en la aparato.