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.

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

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.

Artikli relatati