Ezin diozu Androidei galdetu VPN bat konektatuta dagoen. VpnService-k ez du konexio-getterrik erakusten, eta egoera-barran dagoen giltza ikonoa sistemak marrazten du, zure aplikazioak irakur dezakeen ezerk ez. Egin dezakezuna konektibitate-pilari galdera estuagoa egitea da: zein sare erabiltzen du aplikazio honen trafikoak, eta sare horrek VPN garraioa darama. Gida honek faltsu positiboak saihesten dituen ordenan egiten ditu egiaztapenak, gailuko shell komando batetik aplikazioan martxan uzten duzun callback-era arte.

Egiaztatu gailua shell batetik aplikazioaren kodea ukitu aurretik

Lortu oinarri-lerro bat lehenik. adb shell dumpsys connectivity-ek sistemak ezagutzen duen sare bakoitza inprimatzen du, eta bloke bakoitzak bere garraioak zerrendatzen ditu, beraz VPN sare bat VPN-rekin agertzen da zerrenda horretan. Irakurri sare lehenetsiaren blokea beste edozer baino lehen, eta gero bilatu garraio bera daramaten beste sare batzuk.

Bi irteerek galdera desberdinei erantzuten diete. VPN sare bat egotea ez da gauza bera zure aplikazioak hura erabiltzea, eta laneko profila edo bigarren erabiltzailea duen gailu batean biak aldi berean egiazkoak izan daitezke zure prozesua zuzenean internetekin hitz egiten ari den bitartean. Sare aktiboaren lerroa da zure socketei zer egin erabakitzen diena.

Eskatu aplikazioak erabiltzen duen sarea

Kodean gaitasun-proba lau lerro dira. Eskatu ACCESS_NETWORK_STATE manifestuan, eta gero alderatu sare aktiboaren gaitasunak VPN garraioarekin:

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);

Erantzuna nahita da estua: aplikazioaren sare lehenetsia VPN bat ote den oraintxe. Ez du ezer esaten zein VPN den, zurea den ala ez, edo tunelak bere urruneko muturrera iristen den. Hartu true “trafikoa tunelen batetik irteten da” gisa eta eduki zure kontabilitatea bereizita. Isilpean aldi berean hiru gauza esan nahi dituen boolear batek egiten du ezarpenen pantaila batek VPN-a itzalita bezala jakinaraztea erabiltzailea haren bidez nabigatzen ari den bitartean.

Aitzitik, VPN sare bat badagoen jakin behar duzunean, iteratu cm.getAllNetworks() eta probatu gaitasun-multzo bakoitza. Bi erantzunak desberdintzen dira beste aplikazioak estaltzen dituen baina zurea ez duen aplikazioko VPN bat exekutatzen duen gailu batean, eta desberdintasun hori argi eta garbi piztuta dagoen VPN bat aplikazioak ikusten ez duela dioen akats-txosten gehienen iturria da.

Behatu aldaketak inkestatu beharrean

Tenporizadorearekin inkestatzea galdera honetarako forma okerra da, egoera-aldaketak gertaera gisa iristen direlako. Erregistratu VPN garraioarekin bat datorren eskaera bat eta utzi framework-ari esaten noiz agertzen, desagertzen edo aldatzen den bat datorren sare bat:

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

VPN sare batek ez du inoiz NET_CAPABILITY_NOT_VPN eramaten, beraz kentze esplizituak asmoa dokumentatzen du. Hori gabe eskaerak oraindik bat egiten du, baina kodea irakurtzen duen hurrengo pertsonak berak atera behar du.

Erregistroa behaketaren beharra duen esparruari dagokio, normalean pantaila bati edo aurreko planoan dagoen zerbitzu bati. Ezeztatu erregistroa onStop edo onDestroy-en, eta ez utzi callback bat jada ez dagoen aktibitate batera lotuta. Osagai ikusgarririk gabeko aplikazioa ostalari txarra da behatzaile iraunkor batentzat, eta ahazten dituzun callback-ak konfigurazio-aldaketa baten ondoren hondatzen direnak dira.

Eduki hiru galdera bereizita

Arlo honetako nahasmendu gehiena hiru egiaztapen desberdin bat balira bezala tratatzetik dator. API desberdinak erabiltzen dituzte, eta bakoitza egiazkoa izan daiteke besteak gezurrezkoak diren bitartean.

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

Hirugarren ilara jendeak bezeroan erantzuten saiatzen duena da, eta han ezin da erantzun. Emaiozu VPN bezeroei beren helbide-multzo propioa eta irakurri iturburu-helbidea zerbitzarian; hori da erabiltzaileak saioaren erdian tunela aldatzean bizirik ateratzen den froga bakarra.

Faltsu positiboak baztertzen dituen egiaztapen-ordena

Oraindik zirkulatzen duen lagin-kode zaharrago batek getNetworkInfo(ConnectivityManager.TYPE_VPN) deitzen du. Deialdi hori zaharkituta dago, eta hainbat bertsiotan null itzultzen zuen VPN bat konektatuta zegoela ere, horregatik kopia asko funtzionatzen duen gailu batean hautsita ikusten dira. Gaitasun-egiaztapenek tranpa saihesten dute eta berdin joka dezakete Android 5.0-tik aurrera. Deitzen jarraitzen duen kode-base bat mantentzen baduzu, ordezkatu deialdia fallback batean bildu beharrean, fallback-a izan baitzen erantzun okerra sortu zuen giltza.

Bide labur batek abisua merezi du. Kanpoko zerbitzu batek jakinarazten duen helbide publikoa VPN-aren irteerako helbidearekin alderatzeak zerbait frogatzen du bideari buruz, baina hirugarren baten eskaera gehitzen dio egiaztapen bakoitzari, zerbitzu horrek martxan jarraitzearen mende dago, eta cachean gorde edo blokea daiteke. Eduki ezazu diagnostiko manual gisa, inoiz ez aplikazioaren barruko egoera-egiaztapen gisa.

Exekutatu egiaztapenak ordena honetan eta gelditu erabiltzailearen txostenarekin bat ez datorren lehenengoan: shell-eko garraio-zerrenda, sare aktiboaren gaitasunak, callback gertaerak tunela piztu eta itzaltzen duzun bitartean, gero zerbitzariaren aldeko iturburu-helbidea. Lauak bat badatoz eta aplikazioak gaizki jokatzen badu, akatsa zure egoera-makina propioan dago, ez Androidek sarea ikusteko moduan.

Erlazionatutako artikuluak