Vaša aplikacija pravi prekinjeno, menijska vrstica pravi povezano, promet pa očitno teče. Ta vrzel ni stanje tekmovanja, ki ga popravite s ponovnim poskusom: aplikacija in tunel sta ločena procesa, objekt, ki ga bere vaša koda, pa je v predpomnilniku shranjen pogled na konfiguracijo, ki jo hrani sistem. Površina Personal VPN podjetja Apple je nadzorni API, ne podatkovna pot, in večina njegovega čudnega vedenja izhaja iz tega enega dejstva. Tu je, kaj se v resnici zgodi pri vsakem klicu.

Objekt upravitelja je v predpomnilniku shranjen pogled, ne tunel

NETunnelProviderManager se napolni iz shrambe nastavitev, ki je v lasti sistema, zato njegove lastnosti nič ne pomenijo, dokler se loadFromPreferences ne konča. Če preberete connection.status prej, dobite privzeto vrednost, in zato prvo osveževanje stanja po ponovnem zagonu sporoča prekinjeno, medtem ko tunel deluje. Najprej naložite, nato preberite stanje in konfiguracijo protokola iz istega obravnavalnika dokončanja. Poznejše spremembe opazujte prek NEVPNStatusDidChange namesto s poizvedovanjem, in upoštevajte, da se obvestilo sproži tudi za povezave, ki jih začne On Demand, kjer sploh ni klica aplikacije, ki bi lahko kaj vrnil. Enako velja za nastavitve protokola: berejo se iz naložene konfiguracije, ne iz tega, kar je posredovala aplikacija.

Sam tunel živi v procesu ponudnika Network Extension, zato lahko aplikacija izgubi svoje stanje, ne da bi izgubila povezavo. Vse, kar prikazuje vmesnik, je treba znova sestaviti iz upravitelja, ne pa si zapomniti iz prejšnje seje.

Vrstni red zagona: shrani, naloži, nato zaženi

Povezava, ki temelji na ponudniku, zahteva tri korake po vrsti. Zapišite konfiguracijo ponudnika in pokličite saveToPreferences, naložite upravitelja, da bo shranjena konfiguracija tista, ki jo držite, nato zaženite prek NETunnelProviderSession.startVPNTunnel(). Če shranjevanje preskočite, zagon nima česa zagnati; če naložite pred shranjevanjem, upravitelj še vedno odraža staro konfiguracijo.

Logična vrednost, ki jo vrne startVPNTunnel, pove le, da je bila zahteva sprejeta. Napake na ravni ponudnika pridejo pozneje kot sprememba stanja v prekinjeno, ki jo opazujete prek obvestila NEVPNStatusDidChange, in obravnavalnik obvestila mora znova prebrati connection.status po loadFromPreferences, ker je v predpomnilniku shranjena vrednost morda še stara. Napake na ravni zahteve se vrnejo takoj iz oblike klica, ki meče izjeme, ali prek izhodnega parametra napake startVPNTunnelAndReturnError:. Koda, ki vrnjeno vrednost obravnava kot izid, poroča o povezavi, ki ni bila nikoli vzpostavljena. Druga tiha napaka je identifikator paketa ponudnika, ki se ne ujema z nameščeno razširitvijo: zahteva je zavrnjena in nič v sporočilu ne kaže na identifikator. Če je identifikator napačen, zahteva običajno propade takoj, preden se pojavi katera koli vrstica dnevnika ponudnika.

Ponovno nalaganje nastavitev po zagonu je tisto, kar naredi zaslone stanja pravilne. Upravitelj vam ne potisne nove konfiguracije, ko jo sistem spremeni.

Gradivo zaupanja pride po profilu, nikoli iz kode aplikacije

Aplikacija nima podprtega načina za dodajanje korenskega potrdila v shrambo zaupanja iOS, zato se lahko konfiguracija Personal VPN sklicuje le na gradivo, ki mu naprava že zaupa: verigo, ki jo je vzpostavil nameščen profil, upravljanje naprave ali CA, ki ji sistem zaupa iz drugih razlogov. Aplikacija, ki ob prvem zagonu ustvari svoj CA in pričakuje, da ga bo sistem priznal, bo spodletela pri preverjanju znotraj ponudnika, kjer vmesnik aplikacije ne more videti razloga.

To mejo obravnavajte kot oblikovalsko omejitev, kakršna je, in dostavite sidro zaupanja skupaj s profilom za vpis. Hranite preverjanje pristnosti VPN ločeno od odločitve o zaupanju, ker spodletita na različnih mestih in ju razhroščujeta različna človeka.

Števci prihajajo iz vmesnika, ne iz API-ja VPN

Upravitelj izpostavlja stanje in konfiguracijo in nič, kar bi štelo bajte na tunel. Če potrebujete številke uporabe, pokličite getifaddrs() in preberite if_data za ustrezni vmesnik: en0 za Wi-Fi, vmesnike pdp_ip za mobilno omrežje in napravo utun za sam tunel. Števci utun opisujejo notranji promet in vključujejo stroške protokola.

Te številke so ocene, ne obračunavanje po aplikacijah, in ponastavijo se, ko se vmesnik znova ustvari. Označite jih tako v vmesniku, sicer jih bo nekdo uporabil za izstavitev računa stranki. Če potrebujete številke po aplikacijah, potrebujete povsem drugačen mehanizem, ne boljšega branja teh polj.

Čiščenje spada v stopVPNTunnel, ne v zaključek

applicationWillTerminate vam da nekaj sekund, preden lahko sistem ubije proces, in to ni zanesljiv kraj za razstavljanje povezave. Pošljite ustavitev na stopVPNTunnel() ali jo obravnavajte v povratnem klicu ustavitve ponudnika, in obdržite identifikator upravitelja ali konfiguracije, s katerim ste začeli, da bo ustavitev ciljala to povezavo in ne vsake konfiguracije na napravi.

Shranite ta identifikator ob profilu, ki mu pripada, saj objekt upravitelja ne zabeleži, katero konfiguracijo je uporabnik izbral. In zapomnite si, da povezava, ki jo dvigne On Demand, nima za seboj nobenega klica aplikacije, zato mora zaslon stanja še vedno naložiti nastavitve, preden kar koli nariše.

Sorodni članki