Zergatik erakusten du zure iOS VPN aplikazioak deskonektatuta tunela martxan dagoenean
Zure iOS aplikazioak tunela kontrolatzen du baina ez du bere gain hartzen, eta kudeatzailearen egoera cachean dago. Lehenik hobespenak kargatu, gero egoera eta interfazearen kontagailuak irakurri.
Zure aplikazioak deskonektatuta dio, menu-barrak konektatuta, eta trafikoak argi darama. Tarte hori ez da berriro saiatuz konpon dezakezun lasterketa-baldintza bat: aplikazioa eta tunela prozesu bereiziak dira, eta zure kodeak irakurtzen duen objektua sistemak gordetzen duen konfigurazio baten cacheko ikuspegia da. Apple-ren Personal VPN azalera kontrol API bat da, ez datu-bide bat, eta haren jokaera bitxiaren gehiengoa gertaera horretatik dator. Hona hemen dei bakoitzean benetan gertatzen dena.
Kudeatzailearen objektua cacheko ikuspegia da, ez tunela
NETunnelProviderManager sistemak duen hobespen-biltegi batetik betetzen da, beraz haren propietateek ez dute ezer esan nahi loadFromPreferences amaitzen den arte. Hori baino lehen connection.status irakurtzen baduzu, balio lehenetsi bat lortzen duzu, eta horregatik berrabiaraztearen ondorengo lehen egoera-eguneratzeak deskonektatuta ematen du tunela martxan dagoen bitartean. Lehenik kargatu, eta gero egoera eta protokolo-konfigurazioa amaiera-kudeatzaile beretik irakurri. Geroagoko aldaketak NEVPNStatusDidChange bidez behatu, inkestatu ordez, eta kontuan hartu jakinarazpena On Demand-ek abiatutako konexioetarako ere pizten dela, non ez baitago ezer itzul dezakeen aplikazio-deirik. Gauza bera gertatzen da protokolo-ezarpenekin: kargatutako konfiguraziotik irakurtzen dira, ez aplikazioak pasatako tik.
Tunela bera Network Extension hornitzaile baten prozesuan bizi da, beraz aplikazioak bere egoera gal dezake konexioa galdu gabe. Interfazeak erakusten duen guztia kudeatzailerik berreraiki behar da, ez azken saioko memoriatik.
Abiarazte-ordena: gorde, kargatu, gero abiarazi
Hornitzailean oinarritutako konexioak hiru urrats behar ditu ordenan. Idatzi hornitzailearen konfigurazioa eta deitu saveToPreferences, kargatu kudeatzailea gordetako konfigurazioa zuk duzun hori izan dadin, eta gero abiarazi NETunnelProviderSession.startVPNTunnel() bidez. Gordetzea saltatzen baduzu, abiarazteak ez du abiarazteko ezer; gordetzea baino lehen kargatzen baduzu, kudeatzaileak oraindik konfigurazio zaharra islatzen du.
startVPNTunnel-k itzultzen duen boolearrak eskatutakoa onartu zela besterik ez du esaten. Hornitzaile-mailako hutsegiteak geroago iristen dira deskonektatuta egoerara aldatzean, NEVPNStatusDidChange jakinarazpenaren bidez behatzen duzuna, eta jakinarazpen-kudeatzaileak connection.status berriro irakurri behar du loadFromPreferences ondoren, cacheko balioa oraindik zaharra izan baitaiteke. Eskaera-mailako hutsegiteak berehala itzultzen dira deiren forma jaurtitzailetik edo startVPNTunnelAndReturnError:-ren errore-irteera parametroaren bidez. Itzultze-balioa emaitzatzat hartzen duen kodeak inoiz ezarri ez zen konexio baten berri ematen du. Beste hutsegite isila instalatutako luzapenarekin bat ez datorren hornitzaile-pakete identifikatzailea da: eskaera ukatzen da, eta mezuaren ezerk ez du identifikatzailea seinalatzen. Identifikatzailea oker badago, eskaerak normalean berehala huts egiten du, hornitzailearen erregistro-lerroren bat agertu baino lehen.
Abiarazte baten ondoren hobespenak berrikargatzea da egoera-pantailak zuzen egiten dituena. Kudeatzaileak ez dizu konfigurazio berririk bultzatzen sistemak aldatzen duenean.
Konfiantza-materiala profiletik iristen da, inoiz ez aplikazio-kodetik
Aplikazio batek ez du modu onarturik iOS konfiantza-biltegira erro-certifikatu bat gehitzeko, beraz Personal VPN konfigurazioak gailuak jada fidatzen duen materiala soilik erreferentzia dezake: instalatutako profil batek, gailu-kudeaketak edo sistemak beste arrazoi batzuengatik fidatzen duen CA batek ezarritako katea. Lehen abiaraztean bere CA propioa sortzen duen eta sistemak hura onartuko duela espero duen aplikazioak hornitzailearen barruan huts egingo du baliozkotzean, non aplikazioaren interfazeak ezin duen arrazoia ikusi.
Muga hori den diseinu-murrizketa bezala hartu eta konfiantza-aingura izen-emate-profilarekin batera bidali. Mantendu VPN autentifikazioa konfiantza-erabakitzik bereizita, leku ezberdinetan huts egiten baitute eta pertsona ezberdinek arazten baitituzte.
Kontagailuak interfazetik datoz, ez VPN API-tik
Kudeatzaileak egoera eta konfigurazioa erakusten ditu, eta tunel bakoitzeko byteak zenbatzen dituen ezer ez. Erabilera-zenbakiak behar badituzu, deitu getifaddrs() eta irakurri if_data dagokion interfazerako: en0 Wi-Fi-rako, pdp_ip interfazeak mugikorrerako eta utun gailua tunelerako bererako. utun kontagailuek barne-trafikoa deskribatzen dute eta protokoloaren gainkarga barne hartzen dute.
Zenbaki horiek estimazioak dira, ez aplikazioko kontabilitatea, eta interfazea birsortzen denean berrezartzen dira. Interfazean horrela etiketatu, edo norbaitek bezero bati fakturatzeko erabiliko ditu. Aplikazioko zenbakiak behar badituzu, erabat bestelako mekanismo bat behar duzu, ez eremu horien irakurketa hobea.
Garbiketa stopVPNTunnel-en dago, ez amaieran
applicationWillTerminate-k segundo batzuk ematen dizkizu sistemak prozesua hil aurretik, eta hori ez da konexio bat desmuntatzeko leku fidagarria. Bidali geldiaraztea stopVPNTunnel()-ri edo kudeatu hornitzailearen gelditze-callbackean, eta gorde abiarazi zenuen kudeatzaile edo konfigurazio-identifikatzailea, geldiarazteak konexio horri eragin diezaion gailuko konfigurazio guztiei beharrean.
Gorde identifikatzaile hori dagokion profilaren ondoan, kudeatzaile-objektu batek ez baitu erregistratzen erabiltzaileak zein konfigurazio hautatu zuen. Eta gogoratu On Demand-ek altxatutako konexio batek ez duela atzean aplikazio-deirik, beraz egoera-pantaila batek oraindik hobespenak kargatu behar dituela ezer marraztu aurretik.