Kif tivverifika fil-kodiċi jekk VPN hix konnessa fuq Android
Android m'għandux getter għall-istat tal-konnessjoni tal-VPN. Staqsi l-kapaċitajiet tan-netwerk, osserva l-bidliet fit-trasport, u żomm il-kunsens tal-app, l-istat tal-apparat u l-prova tas-server separati.
Ma tistax tistaqsi lil Android jekk VPN hix konnessa. VpnService ma jesponix getter għall-istat tal-konnessjoni, u l-ikona taċ-ċavetta fil-bar tal-istat tinġibed mis-sistema, mhux minn xi ħaġa li l-app tiegħek tista' taqra. Dak li tista' tagħmel hu li tistaqsi lill-munzell tal-konnettività mistoqsija idjaq: liema netwerk qed juża t-traffiku ta' din l-app, u jekk dan in-netwerk hux qed iġorr it-trasport tal-VPN. Dan il-manwal jimxi mal-verifiki fl-ordni li tevita l-pożittivi foloz, minn kmand shell fuq l-apparat sal-callback li tħalli għaddej fl-app.
Ivverifika l-apparat minn shell qabel ma tmiss il-kodiċi tal-app
L-ewwel ħu bażi. adb shell dumpsys connectivity jistampa kull netwerk li s-sistema taf bih, u kull blokka telenka t-trasporti tagħha, għalhekk netwerk VPN jidher b'VPN f'dik il-lista. Aqra l-blokka tan-netwerk awtomatiku qabel kull ħaġa oħra, imbagħad fittex netwerks oħra li jġorru l-istess trasport.
Żewġ outputs iwieġbu mistoqsijiet differenti. Jekk teżistix netwerk VPN mhuwiex l-istess bħal jekk l-app tiegħek qed tużahx, u fuq apparat b'profil tax-xogħol jew it-tieni utent it-tnejn jistgħu jkunu veri fl-istess ħin waqt li l-proċess tiegħek jitkellem direttament mal-internet. Il-linja tan-netwerk attiv hija dik li tiddeċiedi x'jagħmlu s-sokits tiegħek.
Staqsi għan-netwerk li qed tuża l-app
Fil-kodiċi t-test tal-kapaċità huwa erba' linji. Itlob ACCESS_NETWORK_STATE fil-manifest, imbagħad qabbel il-kapaċitajiet tan-netwerk attiv mat-trasport tal-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);
It-tweġiba hija apposta dejqa: in-netwerk awtomatiku tal-app huwa VPN bħalissa. Ma tgħid xejn dwar liema VPN, jekk hijiex tiegħek, jew jekk il-mina tasalx sat-tarf l-ieħor tagħha. Qis true bħala “t-traffiku joħroġ minn xi mina” u żomm il-kontabbiltà tiegħek separata. Boolean li bla ma jidher ifisser tliet affarijiet fl-istess ħin huwa r-raġuni għaliex skrin tal-issettjar jirrapporta l-VPN bħala mitfi waqt li l-utent qed jibbrawżja permezz tagħha.
Meta għall-kuntrarju jkollok bżonn tkun taf jekk teżistix xi netwerk VPN, ittenni cm.getAllNetworks() u ttestja kull sett ta' kapaċità. Iż-żewġ tweġibiet jiddevjau fuq apparat li jqabbad VPN speċifika għall-app li tkopri applikazzjonijiet oħra imma mhux tiegħek, u dik id-devjazzjoni hija s-sors ta' ħafna mir-rapporti tal-bugs li jgħidu li l-app ma tarax VPN li hija ovvjament mixgħula.
Osserva l-bidliet minflok tagħmel polling
Il-polling b'timer hija l-forma ħażina għal din il-mistoqsija, għax il-bidliet fl-istat jiġu bħala avvenimenti. Irreġistra talba li taqbel mat-trasport tal-VPN u ħalli l-qafas jgħidlek meta netwerk li jaqbel jidher, jisparixxi jew jinbidel:
NetworkRequest request = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_VPN)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.build();
cm.registerNetworkCallback(request, callback);
Netwerk VPN qatt ma jġorr NET_CAPABILITY_NOT_VPN, għalhekk it-tneħħija espliċita tiddokumenta l-intenzjoni. Mingħajrha t-talba xorta taqbel, imma l-persuna li jmiss li taqra l-kodiċi trid tifhem dan waħedha.
Ir-reġistrazzjoni tappartjeni għall-ambitu li jeħtieġ l-osservazzjoni, normalment skrin jew servizz fil-quddiem. Iddereġistra fi onStop jew onDestroy, u tħallix callback imwaħħal ma' attività li diġà marret. App mingħajr komponent viżibbli hija ospitant ħażin għal osservatur permanenti, u l-callbacks li tinsa huma dawk li jaqgħu wara bidla fil-konfigurazzjoni.
Żomm tliet mistoqsijiet separati
Ħafna mill-konfużjoni f'dan il-qasam ġejja milli tittratta tliet verifiki differenti bħala waħda. Jużaw APIs differenti, u kull waħda tista' tkun vera waqt li l-oħrajn huma foloz.
| Question | How you answer it | What a yes means |
|---|---|---|
| Did the user grant VPN consent to my app? | VpnService.prepare() returns null | Consent exists; the tunnel may still be down |
| Is the device sending default traffic through a VPN? | TRANSPORT_VPN on the active network | Something is tunneling, not necessarily your app |
| Did this request arrive through the VPN? | Source address seen by the server | Proof for that connection, nothing wider |
It-tielet ringiela hija dik li n-nies jippruvaw iwieġbu fuq il-klijent, u ma tistax tiġi mwieġba hemmhekk. Agħti lill-klijenti tal-VPN ġabra ta' indirizzi tagħhom u aqra l-indirizz tas-sors fuq is-server; dik hija l-unika prova li tibqa' teżisti meta l-utent jaqleb il-mina f'nofs is-sessjoni.
Ordni ta' verifika li teskludi l-pożittivi foloz
Kodiċi ta' eżempju eqdem li għadu jiċċirkola jsejjaħ lil getNetworkInfo(ConnectivityManager.TYPE_VPN). Dak is-sejħa hija deprekata, u fuq diversi rilaxxi rritorna null anki waqt li VPN kienet konnessa, u għalhekk ħafna siltiet ikkupjati jidhru miksura fuq apparat li jaħdem. Il-verifiki tal-kapaċità jevitaw din in-nassa u jġibu ruħhom l-istess minn Android 5.0 'l quddiem. Jekk tmexxi bażi ta' kodiċi li għadha ssejħilha, ibdel is-sejħa minflok tgeżwerha fi fallback, għax il-fallback huwa dak li pproduċa t-tweġiba ħażina fl-ewwel lok.
Punt wieħed qasir jistħoqqlu twissija. Li tqabbel l-indirizz pubbliku rrappurtat minn servizz estern mal-indirizz tal-ħruġ tal-VPN jipprova xi ħaġa dwar il-passaġġ, imma jżid talba ta' parti terza ma' kull verifika, jiddependi milli dak is-servizz jibqa' ħaj, u jista' jiġi kkważi jew imblukkat. Żommu bħala dijanjostika manwali, qatt bħala l-verifika tal-istat ġewwa l-app.
Mexxi l-verifiki f'dan l-ordni u waqaf fl-ewwel waħda li ma taqbilx mar-rapport tal-utent: lista tat-trasporti mis-shell, kapaċitajiet tan-netwerk attiv, avvenimenti tal-callback waqt li tixgħel u titfi l-mina, imbagħad l-indirizz tas-sors min-naħa tas-server. Jekk l-erbgħa kollha jaqblu u l-app xorta taġixxi ħażin, il-bug jinsab fil-magna tal-istat tiegħek stess, u mhux fil-veduta tan-netwerk ta' Android.