Awukwazi ukubuza i-Android ukuthi i-VPN ixhunyiwe yini. VpnService ayivezi i-getter yesimo sokuxhumana, futhi isithonjana sokhiye kubha yesimo sidwetshwa uhlelo, hhayi into uhlelo lwakho lokusebenza olungayifunda. Ongakwenza ukubuza isitaki sokuxhumana umbuzo omncane: iyiphi inethiwekhi esetshenziswa ukuthutha kwalolu hlelo, futhi ingabe leyo nethiwekhi ithwala ukuthutha kwe-VPN. Lo mhlahlandlela uhamba ngokuhlola ngokulandelana okugwema imiphumela emihle yamanga, kusukela kumyalo we-shell kudivayisi kuze kufike ku-callback oyishiya igijima ohlelweni.

Hlola idivayisi kusukela ku-shell ngaphambi kokuthinta ikhodi yohlelo

Qala ngokuthola isimo esiyisisekelo. adb shell dumpsys connectivity iphrinta yonke inethiwekhi eyaziwa uhlelo, futhi ibhlokhi ngayinye ibala izinto zayo zokuthutha, ngakho inethiwekhi ye-VPN ivela nge-VPN kulolo hlu. Funda ibhlokhi yenethiwekhi ezenzakalelayo ngaphambi kwanoma yini enye, bese ufuna ezinye izinethiwekhi ezithwala ukuthutha okufanayo.

Imiphumela emibili iphendula imibuzo ehlukene. Ukuba khona kwenethiwekhi ye-VPN akufani nokuthi uhlelo lwakho luyisebenzisa, futhi kudivayisi enephrofayela yomsebenzi noma umsebenzisi wesibili kokubili kungaba yiqiniso ngasikhathi sinye ngenkathi inqubo yakho ikhuluma ngqo ne-inthanethi. Umugqa wenethiwekhi esebenzayo yiwo onquma ukuthi amasokhethi akho enza ini.

Buza ngenethiwekhi esetshenziswa uhlelo

Ekhodini ukuhlolwa kwamakhono kuyimigqa emine. Cela i-ACCESS_NETWORK_STATE kumanifesti, bese uqhathanisa amakhono enethiwekhi esebenzayo nokuthutha kwe-VPN:

ConnectivityManager cm = (ConnectivityManager)
    context.getSystemService(Context.CONNECTIVITY_SERVICE);
Network active = cm.getActiveNetwork();
NetworkCapabilities caps = cm.getNetworkCapabilities(active);
boolean vpnInUse = caps != null
    && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);

Impendulo incane ngamabomu: ingabe inethiwekhi ezenzakalelayo yohlelo iyi-VPN manje. Ayisho lutho mayelana nokuthi iyiphi i-VPN, ukuthi ngeyakho yini, noma ukuthi umhubhe ufinyelela kolunye uhlangothi. Thatha i-true njengokuthi “ukuthutha kuphuma ngomhubhe othile” futhi ugcine ukubala kwakho ngokwahlukile. I-boolean esho ngokuthula izinto ezintathu ngasikhathi sinye iyisizathu sokuthi isikrini sezilungiselelo sibike i-VPN njengokuvaliwe ngenkathi umsebenzisi ezulazula ngayo.

Uma ngokuphambene udinga ukwazi ukuthi ikhona yini inethiwekhi ye-VPN, phinda i-cm.getAllNetworks() futhi uhlole isethi ngayinye yamakhono. Izimpendulo ezimbili ziyahlukana kudivayisi egijima i-VPN eqondene nohlelo lokusebenza ehlanganisa ezinye izinhlelo kodwa hhayi olwakho, futhi lowo mehluko uwumthombo wemibiko eminingi yamaphutha ethi uhlelo alunayo i-VPN ebonakala iculile.

Landela izinguquko esikhundleni sokubuza njalo

Ukubuza njalo ngesibali sikakhathi akusona isimo esifanele salo mbuzo, ngoba izinguquko zesimo ziza njengezehlakalo. Bhalisa isicelo esihambisana nokuthutha kwe-VPN bese uvumela uhlaka ukuba lukutshele lapho inethiwekhi ehambisanayo ivela, inyamalala noma ishintsha:

NetworkRequest request = new NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_VPN)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
    .build();
cm.registerNetworkCallback(request, callback);

Inethiwekhi ye-VPN ayikaze ithwale i-NET_CAPABILITY_NOT_VPN, ngakho ukususa ngokusobala kubhalisa inhloso. Ngaphandle kwalokho isicelo sisahambisana, kodwa umuntu olandelayo ofunda ikhodi kufanele azitholele lokho yena.

Ukubhalisa kungokwesimo esidinga ukuqapha, ngokuvamile isikrini noma isevisi yangaphambili. Susa ukubhalisa ku-onStop noma ku-onDestroy, futhi ungashiyi i-callback ixhunywe emsebenzini osewuhambile. Uhlelo olungenaso isakhi esibonakalayo lusingathi olubi kumqaphi ongunaphakade, futhi ama-callback okhohlwayo yiwo aphahlazekayo ngemva koshintsho lwesakhiwo.

Gcina imibuzo emithathu yehlukile

Ingxenye enkulu yokudideka kulesi sikhala ivela ekuthatheni ukuhlola okuthathu okuhlukene njengokukodwa. Kusebenzisa ama-API ahlukene, futhi ngakunye kungaba yiqiniso ngenkathi ezinye zingelona iqiniso.

QuestionHow you answer itWhat a yes means
Did the user grant VPN consent to my app?VpnService.prepare() returns nullConsent exists; the tunnel may still be down
Is the device sending default traffic through a VPN?TRANSPORT_VPN on the active networkSomething is tunneling, not necessarily your app
Did this request arrive through the VPN?Source address seen by the serverProof for that connection, nothing wider

Umugqa wesithathu yiwo abantu abazama ukuwuphendula kuklayenti, futhi awukwazi ukuphendulwa lapho. Nika amaklayenti e-VPN iqoqo lawo lamakheli futhi ufunde ikheli lomthombo kusiphakeli; lowo ngubufakazi bodwa obusala lapho umsebenzisi eshintsha umhubhe phakathi nesikhathi.

Ukulandelana kokuqinisekisa okukhipha imiphumela emihle yamanga

Ikhodi yesibonelo endala esajikelezayo ibiza i-getNetworkInfo(ConnectivityManager.TYPE_VPN). Lelo calli seliphelelwe yisikhathi, futhi kwezinguqulo ezimbalwa lalibuyisela i-null ngisho ngenkathi i-VPN ixhunyiwe, yingakho iziqeshana eziningi ezikopishiwe zibonakala ziphukile kudivayisi esebenzayo. Ukuhlolwa kwamakhono kugwema lolo gibe futhi kuziphatha ngendlela efanayo kusukela ku-Android 5.0 kuya phambili. Uma ugcina isisekelo sekhodi esisayibiza, shintsha ikholi esikhundleni sokuyifaka ku-fallback, ngoba i-fallback yiyo eyakhiqiza impendulo engalungile ekuqaleni.

Indlela eyodwa emfushane ifanele isexwayiso. Ukuqhathanisa ikheli lomphakathi elibikwa isevisi yangaphandle nekheli lokuphuma le-VPN kuqinisekisa okuthile mayelana nendlela, kodwa kunezela isicelo senhlangano yesithathu ekuhloleni ngakunye, kuncike ekutheni leso sevisi sihlale sikhona, futhi kungagcinwa kusikhashana noma kuvinjwe. Kugcine njengokuxilonga ngesandla, hhayi njengokuhlola isimo ngaphakathi kohlelo.

Gijimisa ukuhlola ngokulandelana futhi ume kokokuqala okungavumelani nombiko womsebenzisi: uhlu lokuthutha olusuka ku-shell, amakhono enethiwekhi esebenzayo, izehlakalo ze-callback ngenkathi uvula futhi uvala umhubhe, bese kuba ikheli lomthombo ohlangothini lwesiphakeli. Uma zone zivumelana futhi uhlelo lusaziphatha kabi, iphutha lisekhiyelweni lakho lesimo, hhayi embonweni we-Android wenethiwekhi.

Izihloko ezihlobene