Appið þitt segir aftengt, valmyndastikan segir tengt, og umferðin streymir greinilega. Þetta bil er ekki kapphlaup sem þú lagar með endurtilraun: appið og göngin eru aðskilin ferli, og hluturinn sem kóðinn þinn les er skyndiminnis-sýn á stillingum sem kerfið geymir. Personal VPN flötur Apple er stjórnun-API, ekki gagnaleið, og mest af undarlegri hegðun hans kemur frá þeirri einu staðreynd. Hér er það sem raunverulega gerist við hvert kall.

Stjórnandahluturinn er skyndiminnis-sýn, ekki göngin

NETunnelProviderManager fyllist úr stillingageymslu sem kerfið á, svo eiginleikar hans þýða ekkert fyrr en loadFromPreferences lýkur. Lestu connection.status fyrir það og þú færð sjálfgefið gildi, og þess vegna tilkynnir fyrsta stöðuuppfærslan eftir endurræsingu aftengt meðan göngin eru virk. Hladdu fyrst, lestu svo stöðuna og siðareglur-stillinguna úr sama lokahandfara. Fylgstu með síðari breytingum í gegnum NEVPNStatusDidChange í stað þess að spyrja reglulega, og taktu eftir að tilkynningin kviknar líka fyrir tengingar sem On Demand startar, þar sem ekkert appkall er til að skila nokkru. Sama gildir um siðareglur-stillingar: þær eru lesnar úr hlaðnu stillingunni, ekki því sem appið sendi inn.

Göngin sjálf lifa í ferli Network Extension veitanda, svo appið getur misst sína eigin stöðu án þess að missa tenginguna. Allt sem viðmótið sýnir verður að endurbyggja úr stjórnandanum, ekki muna eftir síðustu lotu.

Röð við ræsingu: geyma, hlaða, svo ræsa

Tenging sem byggir á veitanda þarf þrjú skref í röð. Skrifaðu stillingu veitandans og kallaðu á saveToPreferences, hlattu stjórnandann svo geymda stillingin sé sú sem þú heldur, og ræstu svo í gegnum NETunnelProviderSession.startVPNTunnel(). Sleppir þú geymslunni hefur ræsingin ekkert til að ræsa; hleður þú fyrir geymsluna endurspeglar stjórnandinn enn gömlu stillinguna.

Bólska gildið sem startVPNTunnel skilar segir aðeins að beiðnin hafi verið samþykkt. Bilun á veitandastigi kemur síðar sem stöðubreyting í aftengt, sem þú fylgist með í gegnum tilkynninguna NEVPNStatusDidChange, og tilkynningahandfarinn verður að lesa connection.status aftur eftir loadFromPreferences því skyndiminnisgildið gæti enn verið það gamla. Bilun á beiðnistigi kemur strax til baka úr þeirri mynd kallsins sem kastar villu, eða í gegnum villu-úttaksbreytu startVPNTunnelAndReturnError:. Kóði sem meðhöndlar skilagildið sem niðurstöðu tilkynnir tengingu sem var aldrei komin á. Hin hljóðláta bilun er auðkenni veitandapakka sem passar ekki við uppsetta viðbót: beiðninni er hafnað, og ekkert í skilaboðunum bendir á auðkennið. Ef auðkennið er rangt mistekst beiðnin yfirleitt strax, áður en nokkur logg-lína veitandans birtist.

Endurhleðsla stillinganna eftir ræsingu er það sem gerir stöðuskjái rétta. Stjórnandinn ýtir ekki nýrri stillingu að þér þegar kerfið breytir henni.

Traustefni kemur með prófíl, aldrei úr appkóða

App hefur enga studda leið til að bæta rótarskírteini við traustageymslu iOS, svo Personal VPN stilling getur aðeins vísað í efni sem tækið treystir þegar: keðju sem uppsettur prófíll, tækjastjórnun eða CA sem kerfið treystir af öðrum ástæðum hefur komið á. App sem býr til sitt eigið CA við fyrstu ræsingu og ætlast til að kerfið virði það mun mistakast sannprófunina inni í veitandanum, þar sem viðmót appsins getur ekki séð ástæðuna.

Líttu á þetta landamæri sem þá hönnunartakmörkun sem það er og sendu traustfestuna með skráningarprófílnum. Haltu VPN-auðkenningu aðskilinni frá traustákvörðuninni, því þær mistakast á ólíkum stöðum og ólíkir einstaklingar kemba þær.

Teljarar koma frá viðmótinu, ekki frá VPN API-inu

Stjórnandinn birtir stöðu og stillingu, og ekkert sem telur bæti á hver göng. Ef þú þarft notkunarlegar tölur skaltu kalla á getifaddrs() og lesa if_data fyrir viðeigandi viðmót: en0 fyrir Wi-Fi, pdp_ip viðmótin fyrir farsíma og utun tæki fyrir göngin sjálf. Teljarar utun lýsa innri umferð og innihalda yfirhöfn siðareglna.

Þessar tölur eru ágiskun, ekki bókhald á hvert app, og þær núllstillast þegar viðmótið er endurskapað. Merktu þær þannig í viðmótinu, annars notar einhver þær til að rukka viðskiptavin. Ef þú þarft tölur á hvert app þarftu algjörlega aðra aðferð, ekki betri lestur á þessum reitum.

Hreinsun á heima í stopVPNTunnel, ekki í lokun

applicationWillTerminate gefur þér nokkrar sekúndur áður en kerfið getur drepið ferlið, sem er ekki áreiðanlegur staður til að rífa tengingu niður. Sendu stöðvunina á stopVPNTunnel() eða meðhöndlaðu hana í stöðvunarkalli veitandans, og geymdu auðkenni stjórnandans eða stillingarinnar sem þú ræstir með svo stöðvunin miði á þá tengingu í stað hverrar stillingar á tækinu.

Geymdu þetta auðkenni við hlið prófílsins sem það tilheyrir, því stjórnandahlutur skráir ekki hvaða stillingu notandinn valdi. Og mundu að tenging sem On Demand ræsir hefur ekkert appkall á bak við sig, svo stöðuskjár verður samt að hlaða stillingunum áður en hann teiknar nokkuð.

Tengdir greinar