Għaliex l-app VPN tal-iOS tiegħek turi skonnettjat waqt li t-tunnel qed jaħdem
L-app tal-iOS tiegħek tikkontrolla t-tunnel imma mhix proprjetarja tiegħu, u l-istat tal-maniġer huwa fil-cache. L-ewwel tgħabbi l-preferenzi, imbagħad aqra l-istat u l-kontaturi tal-interface.
L-app tiegħek tgħid skonnettjat, il-bar tal-menu jgħid konness, u t-traffiku b’mod ċar qed jgħaddi. Dan id-distakk mhuwiex kundizzjoni ta’ tellieqa li tissewwa b’tentattiv mill-ġdid: l-app u t-tunnel huma proċessi separati, u l-oġġett li l-kodiċi tiegħek jaqra huwa veduta fil-cache ta’ konfigurazzjoni li s-sistema taħżen. Il-wiċċ Personal VPN ta’ Apple huwa API ta’ kontroll, mhux passaġġ tad-data, u l-biċċa l-kbira tal-imġiba stramba tiegħu tinbet minn dan il-fatt wieħed. Hawn x’jiġri tabilħaqq f’kull sejħa.
L-oġġett tal-maniġer huwa veduta fil-cache, mhux it-tunnel
NETunnelProviderManager jimtela minn maħżen tal-preferenzi li s-sistema tippossjedi, għalhekk il-proprjetajiet tiegħu ma jfissru xejn sakemm loadFromPreferences ma jitlesta. Aqra connection.status qabel dan u tikseb valur awtomatiku, u għalhekk l-ewwel aġġornament tal-istat wara t-tnedija mill-ġdid jirrapporta skonnettjat waqt li t-tunnel qed jaħdem. L-ewwel għabbi, imbagħad aqra l-istat u l-konfigurazzjoni tal-protokoll mill-istess handler tat-tlestija. Osserva bidliet aktar tard permezz ta’ NEVPNStatusDidChange minflok ma tistaqsi b’mod perjodiku, u innota li n-notifika tixgħel ukoll għal konnessjonijiet li jibdew minn On Demand, fejn m’hemm l-ebda sejħa tal-app li tista’ tirritorna xi ħaġa. L-istess jgħodd għas-settings tal-protokoll: jinqraw mill-konfigurazzjoni mgħobbija, mhux minn dak li għaddiet l-app.
It-tunnel innifsu jgħix fi proċess tal-fornitur Network Extension, għalhekk l-app tista’ titlef l-istat tagħha stess mingħajr ma titlef il-konnessjoni. Kull ma turi l-interface għandu jerġa’ jinbena mill-maniġer, mhux jiftakar mis-sessjoni preċedenti.
L-ordni tat-tnedija: issalva, għabbi, imbagħad ibda
Konnessjoni bbażata fuq fornitur teħtieġ tliet passi fl-ordni. Ikteb il-konfigurazzjoni tal-fornitur u sejjaħ saveToPreferences, għabbi l-maniġer sabiex il-konfigurazzjoni salvata tkun dik li għandek f’idejk, imbagħad ibda permezz ta’ NETunnelProviderSession.startVPNTunnel(). Jekk taqbeż is-salvataġġ, it-tnedija m’għandhiex x’tibda; jekk tgħabbi qabel is-salvataġġ, il-maniġer xorta jirrifletti l-konfigurazzjoni l-qadima.
Il-Boolean li jirritorna startVPNTunnel jgħid biss li t-talba ntlaqgħet. Fallimenti fil-livell tal-fornitur jiġu aktar tard bħala bidla fl-istat għal skonnettjat, li tosserva permezz tan-notifika NEVPNStatusDidChange, u l-handler tan-notifika għandu jerġa’ jaqra connection.status wara loadFromPreferences għax il-valur fil-cache jista’ xorta jkun dak il-qadim. Fallimenti fil-livell tat-talba jiġu lura minnufih mill-forma li tarmi eċċezzjoni tas-sejħa, jew permezz tal-parametru tal-output tal-iżball ta’ startVPNTunnelAndReturnError:. Kodiċi li jqis il-valur tar-ritorn bħala r-riżultat jirrapporta konnessjoni li qatt ma ġiet stabbilita. Il-falliment sieket l-ieħor huwa identifikatur tal-bundle tal-fornitur li ma jaqbilx mal-estensjoni installata: it-talba tiġi miċħuda, u xejn fil-messaġġ ma jindika l-identifikatur. Jekk l-identifikatur huwa ħażin, it-talba normalment tfalli mill-ewwel, qabel ma tidher xi linja tal-log tal-fornitur.
It-tagħbija mill-ġdid tal-preferenzi wara tnedija hija dik li tagħmel l-iskrins tal-istat korretti. Il-maniġer ma jimbotta lilek konfigurazzjoni ġdida meta s-sistema tbiddilha.
Il-materjal tal-fiduċja jiġi permezz tal-profil, qatt mill-kodiċi tal-app
App m’għandhiex mod appoġġjat biex iżżid ċertifikat tal-għerq fil-maħżen tal-fiduċja tal-iOS, għalhekk konfigurazzjoni Personal VPN tista’ tirreferi biss għal materjal li l-apparat diġà jafda: katina stabbilita minn profil installat, minn ġestjoni tal-apparat, jew minn CA li s-sistema tafda għal raġunijiet oħra. App li toħloq il-CA tagħha stess fl-ewwel tnedija u tistenna li s-sistema tirrikonoxxiha tfalli l-validazzjoni ġewwa l-fornitur, fejn l-interface tal-app ma tistax tara r-raġuni.
Ikkunsidra dan il-limitu bħala l-kostrizzjoni tad-disinn li huwa, u ibgħat l-ankra tal-fiduċja mal-profil tar-reġistrazzjoni. Żomm l-awtentikazzjoni VPN separata mid-deċiżjoni tal-fiduċja, għax ifallu f’postijiet differenti u jiġu debugjati minn nies differenti.
Il-kontaturi jiġu mill-interface, mhux mill-API tal-VPN
Il-maniġer jesponi l-istat u l-konfigurazzjoni, u xejn li jgħodd il-bytes għal kull tunnel. Jekk għandek bżonn numri tal-użu, sejjaħ getifaddrs() u aqra if_data għall-interface rilevanti: en0 għall-Wi-Fi, l-interfaces pdp_ip għaċ-ċellulari u apparat utun għat-tunnel innifsu. Il-kontaturi ta’ utun jiddeskrivu t-traffiku intern u jinkludu l-overhead tal-protokoll.
Dawn iċ-ċifri huma stimi, mhux kontabilità għal kull app, u jerġgħu jissetjew meta l-interface tinħoloq mill-ġdid. Ittikkettahom hekk fl-interface, inkella xi ħadd jużahom biex jiffattura klijent. Jekk għandek bżonn ċifri għal kull app, għandek bżonn mekkaniżmu kompletament differenti, mhux qari aħjar ta’ dawn l-oqsma.
It-tindif jappartjeni lil stopVPNTunnel, mhux lit-terminazzjoni
applicationWillTerminate jagħtik ftit sekondi qabel ma s-sistema tista’ toqtol il-proċess, u dan mhuwiex post affidabbli biex tħoll konnessjoni. Ibgħat il-waqfien lil stopVPNTunnel() jew immaniġġah fil-callback tal-waqfien tal-fornitur, u żomm l-identifikatur tal-maniġer jew tal-konfigurazzjoni li bdejt bih sabiex il-waqfien jimmira lejn dik il-konnessjoni minflok kull konfigurazzjoni fuq l-apparat.
Aħżen dak l-identifikatur ħdejn il-profil li jappartjeni għalih, għax oġġett tal-maniġer ma jirreġistrax liema konfigurazzjoni għażel l-utent. U ftakar li konnessjoni mqajma minn On Demand m’għandhiex sejħa tal-app warajha xejn, għalhekk skrin tal-istat xorta jrid jgħabbi l-preferenzi qabel ma jpinġi xi ħaġa.