ਤੁਸੀਂ Android ਨੂੰ ਇਹ ਨਹੀਂ ਪੁੱਛ ਸਕਦੇ ਕਿ VPN ਜੁੜਿਆ ਹੈ ਜਾਂ ਨਹੀਂ। VpnService ਜੁੜਨ ਦੀ ਸਥਿਤੀ ਦੇਣ ਵਾਲਾ getter ਨਹੀਂ ਦਿੰਦਾ, ਅਤੇ ਸਥਿਤੀ ਪੱਟੀ ਵਿੱਚ ਚਾਬੀ ਦਾ ਨਿਸ਼ਾਨ ਸਿਸਟਮ ਖਿੱਚਦਾ ਹੈ, ਨਾ ਕਿ ਕੋਈ ਅਜਿਹੀ ਚੀਜ਼ ਜੋ ਤੁਹਾਡੀ ਐਪ ਪੜ੍ਹ ਸਕੇ। ਤੁਸੀਂ ਜੋ ਕਰ ਸਕਦੇ ਹੋ ਉਹ ਹੈ ਕਨੈਕਟੀਵਿਟੀ ਸਟੈਕ ਨੂੰ ਇੱਕ ਹੋਰ ਸੰਕੀਰਣ ਸਵਾਲ ਪੁੱਛਣਾ: ਇਸ ਐਪ ਦਾ ਟ੍ਰੈਫਿਕ ਕਿਹੜਾ ਨੈੱਟਵਰਕ ਵਰਤ ਰਿਹਾ ਹੈ, ਅਤੇ ਕੀ ਉਹ ਨੈੱਟਵਰਕ VPN ਟਰਾਂਸਪੋਰਟ ਢੋਂਦਾ ਹੈ। ਇਹ ਗਾਈਡ ਗਲਤ ਸਕਾਰਾਤਮਕ ਨਤੀਜਿਆਂ ਤੋਂ ਬਚਣ ਵਾਲੇ ਕ੍ਰਮ ਵਿੱਚ ਜਾਂਚਾਂ ਕਰਦੀ ਹੈ, ਡਿਵਾਈਸ ਉੱਤੇ shell ਕਮਾਂਡ ਤੋਂ ਲੈ ਕੇ ਐਪ ਵਿੱਚ ਛੱਡੇ callback ਤੱਕ।

ਐਪ ਦਾ ਕੋਡ ਛੂਹਣ ਤੋਂ ਪਹਿਲਾਂ shell ਤੋਂ ਡਿਵਾਈਸ ਜਾਂਚੋ

ਪਹਿਲਾਂ ਆਧਾਰ ਸਥਿਤੀ ਲਓ। adb shell dumpsys connectivity ਸਿਸਟਮ ਦੇ ਜਾਣੇ ਹਰ ਨੈੱਟਵਰਕ ਨੂੰ ਛਾਪਦਾ ਹੈ, ਅਤੇ ਹਰ ਬਲਾਕ ਆਪਣੇ ਟਰਾਂਸਪੋਰਟ ਗਿਣਾਉਂਦਾ ਹੈ, ਇਸ ਲਈ VPN ਨੈੱਟਵਰਕ ਉਸ ਸੂਚੀ ਵਿੱਚ VPN ਨਾਲ ਦਿਸਦਾ ਹੈ। ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਡਿਫਾਲਟ ਨੈੱਟਵਰਕ ਬਲਾਕ ਪੜ੍ਹੋ, ਫਿਰ ਉਹੀ ਟਰਾਂਸਪੋਰਟ ਢੋਣ ਵਾਲੇ ਹੋਰ ਨੈੱਟਵਰਕ ਲੱਭੋ।

ਦੋ ਆਉਟਪੁੱਟ ਵੱਖਰੇ ਸਵਾਲਾਂ ਦਾ ਜਵਾਬ ਦਿੰਦੇ ਹਨ। VPN ਨੈੱਟਵਰਕ ਹੋਣਾ ਅਤੇ ਤੁਹਾਡੀ ਐਪ ਦਾ ਉਸਨੂੰ ਵਰਤਣਾ ਇੱਕੋ ਗੱਲ ਨਹੀਂ, ਅਤੇ ਕੰਮ ਵਾਲੇ ਪ੍ਰੋਫਾਈਲ ਜਾਂ ਦੂਜੇ ਉਪਭੋਗਤਾ ਵਾਲੇ ਡਿਵਾਈਸ ਉੱਤੇ ਦੋਵੇਂ ਇੱਕੋ ਸਮੇਂ ਸੱਚ ਹੋ ਸਕਦੇ ਹਨ ਜਦੋਂ ਤੁਹਾਡੀ ਪ੍ਰਕਿਰਿਆ ਸਿੱਧਾ ਇੰਟਰਨੈੱਟ ਨਾਲ ਗੱਲ ਕਰ ਰਹੀ ਹੋਵੇ। ਤੁਹਾਡੇ ਸਾਕਟ ਕੀ ਕਰਦੇ ਹਨ ਇਹ ਸਰਗਰਮ ਨੈੱਟਵਰਕ ਦੀ ਲਾਈਨ ਤੈਅ ਕਰਦੀ ਹੈ।

ਐਪ ਜੋ ਨੈੱਟਵਰਕ ਵਰਤ ਰਹੀ ਹੈ ਉਹ ਪੁੱਛੋ

ਕੋਡ ਵਿੱਚ ਸਮਰੱਥਾ ਟੈਸਟ ਚਾਰ ਲਾਈਨਾਂ ਦਾ ਹੈ। ਮੈਨਿਫੈਸਟ ਵਿੱਚ ACCESS_NETWORK_STATE ਮੰਗੋ, ਫਿਰ ਸਰਗਰਮ ਨੈੱਟਵਰਕ ਦੀਆਂ ਸਮਰੱਥਾਵਾਂ ਦੀ 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);

ਜਵਾਬ ਜਾਣਬੁੱਝ ਕੇ ਸੰਕੀਰਣ ਹੈ: ਕੀ ਐਪ ਦਾ ਡਿਫਾਲਟ ਨੈੱਟਵਰਕ ਇਸ ਵੇਲੇ VPN ਹੈ। ਇਹ ਨਹੀਂ ਦੱਸਦਾ ਕਿ ਕਿਹੜਾ VPN, ਕੀ ਉਹ ਤੁਹਾਡਾ ਹੈ, ਜਾਂ ਕੀ ਸੁਰੰਗ ਦੂਜੇ ਸਿਰੇ ਤੱਕ ਪਹੁੰਚਦੀ ਹੈ। true ਨੂੰ “ਟ੍ਰੈਫਿਕ ਕਿਸੇ ਸੁਰੰਗ ਰਾਹੀਂ ਬਾਹਰ ਜਾਂਦਾ ਹੈ” ਸਮਝੋ ਅਤੇ ਆਪਣਾ ਹਿਸਾਬ ਵੱਖਰਾ ਰੱਖੋ। ਤਿੰਨ ਗੱਲਾਂ ਚੁੱਪਚਾਪ ਇੱਕੋ ਸਮੇਂ ਦੱਸਣ ਵਾਲਾ ਬੂਲੀਅਨ ਹੀ ਉਹ ਕਾਰਨ ਹੈ ਕਿ ਉਪਭੋਗਤਾ ਦੇ VPN ਰਾਹੀਂ ਬ੍ਰਾਊਜ਼ ਕਰਦਿਆਂ ਸੈਟਿੰਗ ਸਕਰੀਨ VPN ਨੂੰ ਬੰਦ ਦੱਸਦੀ ਹੈ।

ਇਸ ਦੇ ਉਲਟ, ਜੇ ਤੁਹਾਨੂੰ ਜਾਣਨਾ ਹੈ ਕਿ ਕੋਈ ਵੀ VPN ਨੈੱਟਵਰਕ ਮੌਜੂਦ ਹੈ ਜਾਂ ਨਹੀਂ, ਤਾਂ cm.getAllNetworks() ਉੱਤੇ ਦੁਹਰਾਓ ਅਤੇ ਹਰ ਸਮਰੱਥਾ ਸਮੂਹ ਜਾਂਚੋ। ਦੋਵੇਂ ਜਵਾਬ ਉਸ ਡਿਵਾਈਸ ਉੱਤੇ ਵੱਖ ਹੁੰਦੇ ਹਨ ਜਿੱਥੇ ਹੋਰ ਐਪਾਂ ਨੂੰ ਢਕਣ ਵਾਲਾ ਪਰ ਤੁਹਾਡੀ ਐਪ ਨੂੰ ਨਾ ਢਕਣ ਵਾਲਾ ਐਪ-ਖਾਸ VPN ਚੱਲ ਰਿਹਾ ਹੋਵੇ, ਅਤੇ ਇਹੀ ਫਰਕ ਉਹਨਾਂ ਬੱਗ ਰਿਪੋਰਟਾਂ ਦਾ ਸਰੋਤ ਹੈ ਜੋ ਕਹਿੰਦੀਆਂ ਹਨ ਕਿ ਐਪ ਨੂੰ ਸਾਫ਼ ਤੌਰ ਉੱਤੇ ਚਾਲੂ VPN ਨਹੀਂ ਦਿਸਦਾ।

ਪੋਲਿੰਗ ਦੀ ਥਾਂ ਬਦਲਾਅ ਦੇਖੋ

ਟਾਈਮਰ ਉੱਤੇ ਪੋਲਿੰਗ ਇਸ ਸਵਾਲ ਲਈ ਗਲਤ ਢਾਂਚਾ ਹੈ, ਕਿਉਂਕਿ ਸਥਿਤੀ ਬਦਲਾਅ ਘਟਨਾਵਾਂ ਵਜੋਂ ਆਉਂਦੇ ਹਨ। VPN ਟਰਾਂਸਪੋਰਟ ਨਾਲ ਮੇਲ ਖਾਂਦੀ ਬੇਨਤੀ ਦਰਜ ਕਰੋ ਅਤੇ ਮੇਲ ਖਾਂਦਾ ਨੈੱਟਵਰਕ ਦਿਸਣ, ਗਾਇਬ ਹੋਣ ਜਾਂ ਬਦਲਣ ਵੇਲੇ ਫਰੇਮਵਰਕ ਤੁਹਾਨੂੰ ਦੱਸੇ:

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

VPN ਨੈੱਟਵਰਕ ਕਦੇ ਵੀ NET_CAPABILITY_NOT_VPN ਨਹੀਂ ਢੋਂਦਾ, ਇਸ ਲਈ ਸਪਸ਼ਟ ਹਟਾਉਣਾ ਇਰਾਦੇ ਨੂੰ ਦਰਜ ਕਰਦਾ ਹੈ। ਇਸ ਤੋਂ ਬਿਨਾਂ ਵੀ ਬੇਨਤੀ ਮੇਲ ਖਾਂਦੀ ਹੈ, ਪਰ ਅਗਲੇ ਪਾਠਕ ਨੂੰ ਇਹ ਆਪ ਸਮਝਣਾ ਪਵੇਗਾ।

ਰਜਿਸਟ੍ਰੇਸ਼ਨ ਉਸ ਦਾਇਰੇ ਦੀ ਹੈ ਜਿਸਨੂੰ ਨਿਰੀਖਣ ਚਾਹੀਦਾ ਹੈ, ਆਮ ਤੌਰ ਉੱਤੇ ਸਕਰੀਨ ਜਾਂ ਫੋਰਗਰਾਊਂਡ ਸੇਵਾ। onStop ਜਾਂ onDestroy ਵਿੱਚ ਰਜਿਸਟ੍ਰੇਸ਼ਨ ਹਟਾਓ, ਅਤੇ ਪਹਿਲਾਂ ਹੀ ਜਾ ਚੁੱਕੀ ਗਤੀਵਿਧੀ ਨਾਲ callback ਨਾ ਲਟਕਾਓ। ਦਿਸਣ ਵਾਲਾ ਹਿੱਸਾ ਨਾ ਹੋਣ ਵਾਲੀ ਐਪ ਸਥਾਈ ਨਿਰੀਖਕ ਲਈ ਮਾੜੀ ਮੇਜ਼ਬਾਨ ਹੈ, ਅਤੇ ਭੁੱਲੇ callback ਹੀ ਸੰਰਚਨਾ ਬਦਲਣ ਤੋਂ ਬਾਅਦ ਕ੍ਰੈਸ਼ ਹੁੰਦੇ ਹਨ।

ਤਿੰਨ ਸਵਾਲ ਵੱਖਰੇ ਰੱਖੋ

ਇਸ ਖੇਤਰ ਦੀ ਬਹੁਤੀ ਉਲਝਣ ਤਿੰਨ ਵੱਖਰੀਆਂ ਜਾਂਚਾਂ ਨੂੰ ਇੱਕ ਸਮਝਣ ਤੋਂ ਆਉਂਦੀ ਹੈ। ਉਹ ਵੱਖਰੇ API ਵਰਤਦੀਆਂ ਹਨ, ਅਤੇ ਇੱਕ ਸੱਚ ਹੋਣ ਵੇਲੇ ਬਾਕੀਆਂ ਝੂਠੀਆਂ ਹੋ ਸਕਦੀਆਂ ਹਨ।

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

ਤੀਜੀ ਕਤਾਰ ਉਹ ਹੈ ਜਿਸਦਾ ਜਵਾਬ ਲੋਕ ਕਲਾਇੰਟ ਉੱਤੇ ਦੇਣਾ ਚਾਹੁੰਦੇ ਹਨ, ਅਤੇ ਉੱਥੇ ਜਵਾਬ ਨਹੀਂ ਦਿੱਤਾ ਜਾ ਸਕਦਾ। VPN ਕਲਾਇੰਟਾਂ ਨੂੰ ਆਪਣਾ ਪਤਾ ਪੂਲ ਦਿਓ ਅਤੇ ਸਰਵਰ ਉੱਤੇ ਸਰੋਤ ਪਤਾ ਪੜ੍ਹੋ; ਸੈਸ਼ਨ ਵਿਚਕਾਰ ਉਪਭੋਗਤਾ ਦੇ ਸੁਰੰਗ ਬਦਲਣ ਉੱਤੇ ਵੀ ਇਹੀ ਇੱਕੋ ਸਬੂਤ ਬਚਦਾ ਹੈ।

ਗਲਤ ਸਕਾਰਾਤਮਕ ਨਤੀਜੇ ਖ਼ਤਮ ਕਰਨ ਵਾਲਾ ਜਾਂਚ ਕ੍ਰਮ

ਹਾਲੇ ਵੀ ਪ੍ਰਚਲਿਤ ਪੁਰਾਣਾ ਨਮੂਨਾ ਕੋਡ getNetworkInfo(ConnectivityManager.TYPE_VPN) ਨੂੰ ਕਾਲ ਕਰਦਾ ਹੈ। ਉਹ ਕਾਲ ਬਹੁਤ ਪੁਰਾਣੀ ਹੈ, ਅਤੇ ਕਈ ਰਿਲੀਜ਼ਾਂ ਵਿੱਚ VPN ਜੁੜਿਆ ਹੋਣ ਸਮੇਂ ਵੀ null ਵਾਪਸ ਕਰਦੀ ਸੀ, ਇਸੇ ਲਈ ਬਹੁਤ ਸਾਰੇ ਕਾਪੀ ਕੀਤੇ ਟੁਕੜੇ ਕੰਮ ਕਰਦੇ ਡਿਵਾਈਸ ਉੱਤੇ ਟੁੱਟੇ ਦਿਸਦੇ ਹਨ। ਸਮਰੱਥਾ ਜਾਂਚਾਂ ਇਸ ਜਾਲ ਤੋਂ ਬਚਦੀਆਂ ਹਨ ਅਤੇ Android 5.0 ਤੋਂ ਬਾਅਦ ਇੱਕੋ ਜਿਹਾ ਵਿਵਹਾਰ ਕਰਦੀਆਂ ਹਨ। ਜੇ ਤੁਸੀਂ ਅਜੇ ਵੀ ਇਸਨੂੰ ਕਾਲ ਕਰਨ ਵਾਲਾ ਕੋਡਬੇਸ ਸੰਭਾਲਦੇ ਹੋ, ਤਾਂ ਫਾਲਬੈਕ ਵਿੱਚ ਲਪੇਟਣ ਦੀ ਥਾਂ ਕਾਲ ਨੂੰ ਬਦਲੋ, ਕਿਉਂਕਿ ਗਲਤ ਜਵਾਬ ਪਹਿਲਾਂ ਪੈਦਾ ਕਰਨ ਵਾਲਾ ਉਹੀ ਫਾਲਬੈਕ ਸੀ।

ਇੱਕ ਸ਼ਾਰਟਕੱਟ ਚੇਤਾਵਨੀ ਦਾ ਹੱਕਦਾਰ ਹੈ। ਬਾਹਰੀ ਸੇਵਾ ਵੱਲੋਂ ਦੱਸੇ ਜਾਣ ਵਾਲੇ ਜਨਤਕ ਪਤੇ ਦੀ VPN ਦੇ ਨਿਕਾਸ ਪਤੇ ਨਾਲ ਤੁਲਨਾ ਰਸਤੇ ਬਾਰੇ ਕੁਝ ਸਾਬਤ ਕਰਦੀ ਹੈ, ਪਰ ਇਹ ਹਰ ਜਾਂਚ ਵਿੱਚ ਤੀਜੀ ਧਿਰ ਦੀ ਬੇਨਤੀ ਜੋੜਦੀ ਹੈ, ਉਸ ਸੇਵਾ ਦੇ ਚੱਲਦੇ ਰਹਿਣ ਉੱਤੇ ਨਿਰਭਰ ਕਰਦੀ ਹੈ, ਅਤੇ ਕੈਸ਼ ਜਾਂ ਬਲਾਕ ਹੋ ਸਕਦੀ ਹੈ। ਇਸਨੂੰ ਹੱਥੀਂ ਕੀਤੀ ਜਾਂਚ ਰੱਖੋ, ਐਪ ਅੰਦਰ ਸਥਿਤੀ ਜਾਂਚ ਵਜੋਂ ਕਦੇ ਨਹੀਂ।

ਇਸ ਕ੍ਰਮ ਵਿੱਚ ਜਾਂਚਾਂ ਚਲਾਓ ਅਤੇ ਉਪਭੋਗਤਾ ਦੀ ਰਿਪੋਰਟ ਨਾਲ ਨਾ ਮਿਲਦੀ ਪਹਿਲੀ ਉੱਤੇ ਰੁਕੋ: shell ਦੀ ਟਰਾਂਸਪੋਰਟ ਸੂਚੀ, ਸਰਗਰਮ ਨੈੱਟਵਰਕ ਸਮਰੱਥਾਵਾਂ, ਸੁਰੰਗ ਚਾਲੂ-ਬੰਦ ਕਰਦਿਆਂ callback ਘਟਨਾਵਾਂ, ਫਿਰ ਸਰਵਰ-ਪਾਸੇ ਸਰੋਤ ਪਤਾ। ਜੇ ਚਾਰੇ ਮਿਲਦੇ ਹਨ ਅਤੇ ਐਪ ਫਿਰ ਵੀ ਗਲਤ ਵਿਵਹਾਰ ਕਰਦੀ ਹੈ, ਤਾਂ ਬੱਗ Android ਦੇ ਨੈੱਟਵਰਕ ਨਜ਼ਰੀਏ ਵਿੱਚ ਨਹੀਂ, ਤੁਹਾਡੀ ਆਪਣੀ ਸਥਿਤੀ ਮਸ਼ੀਨ ਵਿੱਚ ਹੈ।

ਸੰਬੰਧਿਤ ਲੇਖ