App rẹ sọ pé ó gé kuro, ọ̀pá àkójọ sọ pé ó so pọ̀, àti pé ìṣàn ń lọ kedere. Àlàfo yẹn kì í ṣe ipò eré-ìje tí o ń tún ṣe pẹ̀lú ìgbìyànjú mìíràn: app àti tunnel jẹ́ àwọn ìlànà ọ̀tọ̀ọ̀tọ̀, àti ohun tí kóòdù rẹ ń kà jẹ́ ìwòye tí a fi pamọ́ nínú cache ti ìṣètò tí ẹ̀rọ ń tọ́jú. Ojú Personal VPN ti Apple jẹ́ API ìṣàkóso, kì í ṣe ọ̀nà dátà, àti pé ọ̀pọ̀lọpọ̀ ìhùwàsí àjèjì rẹ̀ wá láti inú òtítọ́ kan náà. Èyí ni ohun tí ń ṣẹlẹ̀ níti gidi nínú ìpè kọ̀ọ̀kan.

Ohun olùṣàkóso jẹ́ ìwòye cache, kì í ṣe tunnel

NETunnelProviderManager ń kún láti inú ìpamọ́ àṣàyàn tí ẹ̀rọ ni, nítorí náà àwọn ànímọ́ rẹ̀ kò ní ìtumọ̀ kankan títí loadFromPreferences yóò fi parí. Tí o bá ka connection.status ṣáájú ìyẹn, ìwọ yóò rí iye àkọ́kọ́, ìyẹn sì ni ìdí tí ìmúdójúìwọ̀n ipò àkọ́kọ́ lẹ́yìn àtúnbẹ̀rẹ̀ fi ń sọ pé ó gé kuro nígbà tí tunnel ń ṣiṣẹ́. Kọ́kọ́ gbé wọlé, lẹ́yìn náà ka ipò àti ìṣètò protocol láti inú olùṣàkóso ìparí kan náà. Fi ojú tọpinpin àwọn àyípadà tó ń bọ̀ nípa NEVPNStatusDidChange dípò pípè lẹ́ẹ̀kọ̀ọ̀kan, kí o sì ṣàkíyèsí pé ìkìlọ̀ náà tún ń dánu fún àwọn ìsopọ̀ tí On Demand bẹ̀rẹ̀, níbi tí kò sí ìpè app kankan láti dá ohunkóhun padà. Bákan náà ni fún àwọn ètò protocol: a ń kà wọ́n láti inú ìṣètò tí a gbé wọlé, kì í ṣe ohun tí app náà kójá.

Tunnel fúnra rẹ̀ ń gbé nínú ìlànà olùpèsè Network Extension, nítorí náà app lè pàdánù ipò tirẹ̀ láìpadánù ìsopọ̀. Gbogbo ohun tí interface ń fi hàn gbọ́dọ̀ tún un kọ́ láti inú olùṣàkóso, kì í ṣe rántí láti inú àpérò tó kọjá.

Ìtò ìbẹ̀rẹ̀: tọ́jú, gbé wọlé, lẹ́yìn náà bẹ̀rẹ̀

Ìsopọ̀ tí ó dá lórí olùpèsè nílò ìgbésẹ̀ mẹ́ta ní ìtò. Kọ ìṣètò olùpèsè kí o sì pe saveToPreferences, gbé olùṣàkóso wọlé kí ìṣètò tí a tọ́jú jẹ́ èyí tí o mú lọ́wọ́, lẹ́yìn náà bẹ̀rẹ̀ nípasẹ̀ NETunnelProviderSession.startVPNTunnel(). Tí o bá fojú fo ìtọ́jú, ìbẹ̀rẹ̀ kò ní ohunkóhun láti bẹ̀rẹ̀; tí o bá gbé wọlé ṣáájú ìtọ́jú, olùṣàkóso ṣì ń fi ìṣètò àtijọ́ hàn.

Booléén tí startVPNTunnel ń dá padà kìkì sọ pé a gba ìbéèrè náà. Àwọn ìkùnà ní ìpele olùpèsè ń dé lẹ́yìn náà gẹ́gẹ́ bí ìyípadà ipò sí gé kuro, èyí tí o ń wo nípasẹ̀ ìkìlọ̀ NEVPNStatusDidChange, àti pé olùṣàkóso ìkìlọ̀ gbọ́dọ̀ tún connection.status kà lẹ́yìn loadFromPreferences nítorí iye cache náà lè ṣì jẹ́ ti àtijọ́. Àwọn ìkùnà ní ìpele ìbéèrè ń dá padà lẹ́sẹ̀kẹsẹ̀ láti inú irú ìpè tí ń ju ìyọkú jáde, tàbí nípasẹ̀ pàrámítà ìjáde àṣìṣe ti startVPNTunnelAndReturnError:. Kóòdù tí ó kà iye ìdápadà gẹ́gẹ́ bí àbájáde ń jábọ̀ ìsopọ̀ tí a kò dá sílẹ̀ rárá. Ìkùnà tó dákẹ́ mìíràn ni ìdánimọ̀ àkójọ olùpèsè tí kò bá àfikún tí a fi sínú mu: a kọ ìbéèrè náà, kò sì sí ohunkóhun nínú ìfiránṣẹ́ tí ń tọ́ka sí ìdánimọ̀ náà. Bí ìdánimọ̀ náà bá ṣe àṣìṣe, ìbéèrè náà sábà kùnà lẹ́sẹ̀kẹsẹ̀, kí ìlà àkọsílẹ̀ kankan ti olùpèsè tó fara hàn.

Àtún gbé àwọn àṣàyàn wọlé lẹ́yìn ìbẹ̀rẹ̀ ni ohun tí ń mú àwọn ojú-ìwé ipò tọ̀nà. Olùṣàkóso kì í tì ìṣètò tuntun mọ́ ọ nígbà tí ẹ̀rọ bá yí i padà.

Ẹrù ìgbẹ́kẹ̀lé ń wá nípasẹ̀ profáìlì, kì í wá láti inú kóòdù app rárá

App kò ní ọ̀nà tí a ṣe àtìlẹ́yìn fún láti fi ìwé-ẹ̀rí gbòǹgbò kún ìpamọ́ ìgbẹ́kẹ̀lé iOS, nítorí náà ìṣètò Personal VPN lè tọ́ka sí ẹrù tí ẹ̀rọ náà ti gbẹ́kẹ̀lé tẹ́lẹ̀ nìkan: ẹ̀wọ̀n tí profáìlì tí a fi sínú, ìṣàkóso ẹ̀rọ tàbí CA tí ẹ̀rọ gbẹ́kẹ̀lé fún àwọn ìdí mìíràn dá sílẹ̀. App tí ó dá CA tirẹ̀ ní ìgbà àkọ́kọ́ tí ó sì retí pé ẹ̀rọ yóò gbà á yóò kùnà ní ìmúdájú inú olùpèsè, níbi tí interface app kò ti lè rí ìdí náà.

Wo ààlà yẹn gẹ́gẹ́ bí ìdínà àpẹrẹ bí ó ṣe rí, kí o sì fi ìdúró ìgbẹ́kẹ̀lé ránṣẹ́ pẹ̀lú profáìlì ìforúkọsílẹ̀. Yà ìjẹ́rìí VPN sọ́tọ̀ kúrò nínú ìpinnu ìgbẹ́kẹ̀lé, nítorí wọ́n ń kùnà ní ibi ọ̀tọ̀ọ̀tọ̀ àti ènìyàn ọ̀tọ̀ọ̀tọ̀ ló ń yanjú wọn.

Àwọn kàǹkà ń wá láti inú interface, kì í ṣe láti API VPN

Olùṣàkóso ń fi ipò àti ìṣètò hàn, kò sì sí ohun tí ń ka byte fún tunnel kọ̀ọ̀kan. Bí o bá nílò àwọn nọ́mbà ìlò, pe getifaddrs() kí o sì ka if_data fún interface tí ó yẹ: en0 fún Wi-Fi, àwọn interface pdp_ip fún alágbèéká, àti ẹ̀rọ utun fún tunnel fúnra rẹ̀. Àwọn kàǹkà utun ń ṣàpèjúwe ìṣàn inú, wọ́n sì ní àfikún iṣẹ́ protocol.

Àwọn nọ́mbà wọ̀nyí jẹ́ àfojúsùn, kì í ṣe ìṣirò fún app kọ̀ọ̀kan, a sì ń tún wọn ṣe nígbà tí a bá tún interface dá. Fi àmì wọ́n bẹ́ẹ̀ nínú interface, bí bẹ́ẹ̀ kọ́ ẹnìkan yóò lò wọ́n láti fi gbese owó fún alábàárà. Bí o bá nílò nọ́mbà fún app kọ̀ọ̀kan, o nílò ẹ̀rọ mìíràn pátápátá, kì í ṣe kíkà àwọn pápá wọ̀nyí dáradára.

Ìmọ́tótó wà nínú stopVPNTunnel, kì í ṣe ní ìparí

applicationWillTerminate ń fún ọ ní ìṣẹ́jú àáyá díẹ̀ kí ẹ̀rọ tó lè pa ìlànà náà, ìyẹn kò sì ṣe ibi tí a lè gbẹ́kẹ̀lé láti tú ìsopọ̀ ká. Fi ìdádúró ránṣẹ́ sí stopVPNTunnel() tàbí kí o ṣàkóso rẹ̀ nínú callback ìdádúró olùpèsè, kí o sì tọ́jú ìdánimọ̀ olùṣàkóso tàbí ìṣètò tí o fi bẹ̀rẹ̀ kí ìdádúró lè dojú kọ ìsopọ̀ yẹn dípò gbogbo ìṣètò lórí ẹ̀rọ.

Tọ́jú ìdánimọ̀ yẹn lẹ́gbẹ̀ẹ́ profáìlì tí ó jẹ́ tirẹ̀, nítorí ohun olùṣàkóso kì í ṣàkọsílẹ̀ ìṣètò tí olùmúlò yàn. Kí o sì rántí pé ìsopọ̀ tí On Demand gbé sókè kò ní ìpè app kankan lẹ́yìn rẹ̀ rárá, nítorí náà ojú-ìwé ipò ṣì gbọ́dọ̀ gbé àwọn àṣàyàn wọlé kí ó tó ya ohunkóhun.

Àwọn àpilẹ̀kọ tó jọra