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

ਮੈਨੇਜਰ ਵਸਤੂ ਕੈਸ਼ ਕੀਤਾ ਦ੍ਰਿਸ਼ ਹੈ, ਟਨਲ ਨਹੀਂ

NETunnelProviderManager ਸਿਸਟਮ ਦੀ ਮਲਕੀਅਤ ਵਾਲੇ ਤਰਜੀਹਾਂ ਭੰਡਾਰ ਤੋਂ ਭਰਿਆ ਜਾਂਦਾ ਹੈ, ਇਸ ਲਈ loadFromPreferences ਪੂਰਾ ਹੋਣ ਤੱਕ ਇਸਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਕੋਈ ਅਰਥ ਨਹੀਂ। ਉਸ ਤੋਂ ਪਹਿਲਾਂ connection.status ਪੜ੍ਹੋ ਤਾਂ ਤੁਹਾਨੂੰ ਡਿਫਾਲਟ ਮੁੱਲ ਮਿਲਦਾ ਹੈ, ਅਤੇ ਇਸੇ ਲਈ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਬਾਅਦ ਪਹਿਲੀ ਸਥਿਤੀ ਤਾਜ਼ਾ ਕਰਨਾ ਟਨਲ ਚੱਲਦੇ ਹੋਏ ਵੀ ਡਿਸਕਨੈਕਟ ਦੱਸਦਾ ਹੈ। ਪਹਿਲਾਂ ਲੋਡ ਕਰੋ, ਫਿਰ ਉਸੇ ਮੁਕੰਮਲ ਹੈਂਡਲਰ ਤੋਂ ਸਥਿਤੀ ਅਤੇ ਪ੍ਰੋਟੋਕੋਲ ਸੰਰਚਨਾ ਪੜ੍ਹੋ। ਬਾਅਦ ਦੀਆਂ ਤਬਦੀਲੀਆਂ ਪੋਲਿੰਗ ਦੀ ਥਾਂ NEVPNStatusDidChange ਰਾਹੀਂ ਵੇਖੋ, ਅਤੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸੂਚਨਾ On Demand ਵੱਲੋਂ ਸ਼ੁਰੂ ਕੀਤੇ ਕਨੈਕਸ਼ਨਾਂ ਲਈ ਵੀ ਆਉਂਦੀ ਹੈ, ਜਿੱਥੇ ਕੁਝ ਵੀ ਵਾਪਸ ਕਰਨ ਵਾਲੀ ਕੋਈ ਐਪ ਕਾਲ ਹੀ ਨਹੀਂ ਹੁੰਦੀ। ਪ੍ਰੋਟੋਕੋਲ ਸੈਟਿੰਗਾਂ ਲਈ ਵੀ ਇਹੀ ਲਾਗੂ ਹੁੰਦਾ ਹੈ: ਉਹ ਲੋਡ ਕੀਤੀ ਸੰਰਚਨਾ ਤੋਂ ਪੜ੍ਹੀਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਐਪ ਵੱਲੋਂ ਭੇਜੇ ਤੋਂ ਨਹੀਂ।

ਟਨਲ ਆਪਣੇ ਆਪ Network Extension ਪ੍ਰਦਾਤਾ ਪ੍ਰੋਸੈਸ ਵਿੱਚ ਰਹਿੰਦਾ ਹੈ, ਇਸ ਲਈ ਐਪ ਕਨੈਕਸ਼ਨ ਗੁਆਏ ਬਿਨਾਂ ਆਪਣੀ ਸਥਿਤੀ ਗੁਆ ਸਕਦੀ ਹੈ। ਇੰਟਰਫੇਸ ਜੋ ਵੀ ਦਿਖਾਉਂਦਾ ਹੈ ਉਹ ਮੈਨੇਜਰ ਤੋਂ ਮੁੜ ਬਣਾਇਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ, ਪਿਛਲੇ ਸੈਸ਼ਨ ਤੋਂ ਯਾਦ ਨਹੀਂ ਰੱਖਣਾ ਚਾਹੀਦਾ।

ਸ਼ੁਰੂ ਕਰਨ ਦਾ ਕ੍ਰਮ: ਸੰਭਾਲੋ, ਲੋਡ ਕਰੋ, ਫਿਰ ਸ਼ੁਰੂ ਕਰੋ

ਪ੍ਰਦਾਤਾ-ਅਧਾਰਿਤ ਕਨੈਕਸ਼ਨ ਲਈ ਕ੍ਰਮ ਵਿੱਚ ਤਿੰਨ ਕਦਮ ਚਾਹੀਦੇ ਹਨ। ਪ੍ਰਦਾਤਾ ਸੰਰਚਨਾ ਲਿਖੋ ਅਤੇ saveToPreferences ਕਾਲ ਕਰੋ, ਮੈਨੇਜਰ ਲੋਡ ਕਰੋ ਤਾਂ ਜੋ ਸੰਭਾਲੀ ਸੰਰਚਨਾ ਤੁਹਾਡੇ ਹੱਥ ਵਾਲੀ ਹੋਵੇ, ਫਿਰ NETunnelProviderSession.startVPNTunnel() ਰਾਹੀਂ ਸ਼ੁਰੂ ਕਰੋ। ਸੰਭਾਲਣਾ ਛੱਡ ਦਿਓ ਤਾਂ ਸ਼ੁਰੂ ਕਰਨ ਕੋਲ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਕੁਝ ਨਹੀਂ; ਸੰਭਾਲਣ ਤੋਂ ਪਹਿਲਾਂ ਲੋਡ ਕਰੋ ਤਾਂ ਮੈਨੇਜਰ ਅਜੇ ਵੀ ਪੁਰਾਣੀ ਸੰਰਚਨਾ ਦਰਸਾਉਂਦਾ ਹੈ।

startVPNTunnel ਜੋ ਬੂਲੀਅਨ ਵਾਪਸ ਕਰਦਾ ਹੈ ਉਹ ਸਿਰਫ਼ ਕਹਿੰਦਾ ਹੈ ਕਿ ਬੇਨਤੀ ਸਵੀਕਾਰ ਹੋਈ। ਪ੍ਰਦਾਤਾ ਪੱਧਰ ਦੀਆਂ ਅਸਫਲਤਾਵਾਂ ਬਾਅਦ ਵਿੱਚ ਡਿਸਕਨੈਕਟ ਸਥਿਤੀ ਵਿੱਚ ਬਦਲਾਅ ਵਜੋਂ ਆਉਂਦੀਆਂ ਹਨ, ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ NEVPNStatusDidChange ਸੂਚਨਾ ਰਾਹੀਂ ਵੇਖਦੇ ਹੋ, ਅਤੇ ਸੂਚਨਾ ਹੈਂਡਲਰ ਨੂੰ loadFromPreferences ਤੋਂ ਬਾਅਦ connection.status ਦੁਬਾਰਾ ਪੜ੍ਹਨਾ ਪੈਂਦਾ ਹੈ ਕਿਉਂਕਿ ਕੈਸ਼ ਕੀਤਾ ਮੁੱਲ ਅਜੇ ਵੀ ਪੁਰਾਣਾ ਹੋ ਸਕਦਾ ਹੈ। ਬੇਨਤੀ ਪੱਧਰ ਦੀਆਂ ਅਸਫਲਤਾਵਾਂ ਕਾਲ ਦੇ ਅਪਵਾਦ ਸੁੱਟਣ ਵਾਲੇ ਰੂਪ ਤੋਂ ਤੁਰੰਤ ਵਾਪਸ ਆਉਂਦੀਆਂ ਹਨ, ਜਾਂ startVPNTunnelAndReturnError: ਦੇ ਗਲਤੀ ਆਉਟ-ਪੈਰਾਮੀਟਰ ਰਾਹੀਂ। ਜੋ ਕੋਡ ਵਾਪਸੀ ਮੁੱਲ ਨੂੰ ਨਤੀਜਾ ਮੰਨਦਾ ਹੈ ਉਹ ਅਜਿਹੇ ਕਨੈਕਸ਼ਨ ਦੀ ਰਿਪੋਰਟ ਕਰਦਾ ਹੈ ਜੋ ਕਦੇ ਸਥਾਪਿਤ ਨਹੀਂ ਹੋਇਆ। ਦੂਜੀ ਚੁੱਪ ਅਸਫਲਤਾ ਉਹ ਪ੍ਰਦਾਤਾ ਬੰਡਲ ਪਛਾਣਕਰਤਾ ਹੈ ਜੋ ਸਥਾਪਿਤ ਐਕਸਟੈਂਸ਼ਨ ਨਾਲ ਮੇਲ ਨਹੀਂ ਖਾਂਦਾ: ਬੇਨਤੀ ਰੱਦ ਹੋ ਜਾਂਦੀ ਹੈ, ਅਤੇ ਸੰਦੇਸ਼ ਵਿੱਚ ਕੁਝ ਵੀ ਪਛਾਣਕਰਤਾ ਵੱਲ ਇਸ਼ਾਰਾ ਨਹੀਂ ਕਰਦਾ। ਜੇ ਪਛਾਣਕਰਤਾ ਗਲਤ ਹੈ ਤਾਂ ਬੇਨਤੀ ਆਮ ਤੌਰ ਤੇ ਤੁਰੰਤ ਅਸਫਲ ਹੁੰਦੀ ਹੈ, ਪ੍ਰਦਾਤਾ ਦੀ ਇੱਕ ਵੀ ਲੌਗ ਲਾਈਨ ਆਉਣ ਤੋਂ ਪਹਿਲਾਂ।

ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਬਾਅਦ ਤਰਜੀਹਾਂ ਮੁੜ ਲੋਡ ਕਰਨਾ ਹੀ ਸਥਿਤੀ ਸਕ੍ਰੀਨਾਂ ਨੂੰ ਸਹੀ ਬਣਾਉਂਦਾ ਹੈ। ਸਿਸਟਮ ਸੰਰਚਨਾ ਬਦਲਦਾ ਹੈ ਤਾਂ ਮੈਨੇਜਰ ਤੁਹਾਡੇ ਵੱਲ ਨਵੀਂ ਸੰਰਚਨਾ ਧੱਕਦਾ ਨਹੀਂ।

ਭਰੋਸਾ ਸਮੱਗਰੀ ਪ੍ਰੋਫਾਈਲ ਰਾਹੀਂ ਆਉਂਦੀ ਹੈ, ਐਪ ਕੋਡ ਤੋਂ ਕਦੇ ਨਹੀਂ

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

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

ਕਾਊਂਟਰ ਇੰਟਰਫੇਸ ਤੋਂ ਆਉਂਦੇ ਹਨ, VPN API ਤੋਂ ਨਹੀਂ

ਮੈਨੇਜਰ ਸਥਿਤੀ ਅਤੇ ਸੰਰਚਨਾ ਦਿਖਾਉਂਦਾ ਹੈ, ਅਤੇ ਹਰ ਟਨਲ ਦੇ ਬਾਈਟ ਗਿਣਨ ਵਾਲਾ ਕੁਝ ਨਹੀਂ। ਜੇ ਤੁਹਾਨੂੰ ਵਰਤੋਂ ਦੇ ਅੰਕੜੇ ਚਾਹੀਦੇ ਹਨ ਤਾਂ getifaddrs() ਕਾਲ ਕਰੋ ਅਤੇ ਸੰਬੰਧਿਤ ਇੰਟਰਫੇਸ ਲਈ if_data ਪੜ੍ਹੋ: Wi-Fi ਲਈ en0, ਸੈਲੂਲਰ ਲਈ pdp_ip ਇੰਟਰਫੇਸ, ਅਤੇ ਟਨਲ ਲਈ ਹੀ utun ਡਿਵਾਈਸ। utun ਕਾਊਂਟਰ ਅੰਦਰੂਨੀ ਟ੍ਰੈਫਿਕ ਦਾ ਵਰਣਨ ਕਰਦੇ ਹਨ ਅਤੇ ਪ੍ਰੋਟੋਕੋਲ ਓਵਰਹੈੱਡ ਸ਼ਾਮਲ ਕਰਦੇ ਹਨ।

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

ਸਫਾਈ stopVPNTunnel ਵਿੱਚ ਹੈ, ਸਮਾਪਤੀ ਵਿੱਚ ਨਹੀਂ

applicationWillTerminate ਤੁਹਾਨੂੰ ਕੁਝ ਸਕਿੰਟ ਦਿੰਦਾ ਹੈ ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਕਿ ਸਿਸਟਮ ਪ੍ਰੋਸੈਸ ਨੂੰ ਮਾਰ ਸਕੇ, ਜੋ ਕਨੈਕਸ਼ਨ ਤੋੜਨ ਲਈ ਭਰੋਸੇਯੋਗ ਥਾਂ ਨਹੀਂ ਹੈ। ਰੋਕ stopVPNTunnel() ਨੂੰ ਭੇਜੋ ਜਾਂ ਪ੍ਰਦਾਤਾ ਦੇ ਰੋਕ ਕਾਲਬੈਕ ਵਿੱਚ ਸੰਭਾਲੋ, ਅਤੇ ਜੋ ਮੈਨੇਜਰ ਜਾਂ ਸੰਰਚਨਾ ਪਛਾਣਕਰਤਾ ਤੁਸੀਂ ਸ਼ੁਰੂ ਕੀਤਾ ਸੀ ਉਹ ਰੱਖੋ ਤਾਂ ਜੋ ਰੋਕ ਡਿਵਾਈਸ ਦੀ ਹਰ ਸੰਰਚਨਾ ਦੀ ਥਾਂ ਉਸੇ ਕਨੈਕਸ਼ਨ ਨੂੰ ਨਿਸ਼ਾਨਾ ਬਣਾਵੇ।

ਉਹ ਪਛਾਣਕਰਤਾ ਉਸ ਪ੍ਰੋਫਾਈਲ ਦੇ ਕੋਲ ਸੰਭਾਲੋ ਜਿਸਦਾ ਉਹ ਹੈ, ਕਿਉਂਕਿ ਮੈਨੇਜਰ ਵਸਤੂ ਇਹ ਦਰਜ ਨਹੀਂ ਕਰਦੀ ਕਿ ਵਰਤੋਂਕਾਰ ਨੇ ਕਿਹੜੀ ਸੰਰਚਨਾ ਚੁਣੀ। ਅਤੇ ਯਾਦ ਰੱਖੋ ਕਿ On Demand ਵੱਲੋਂ ਚੁੱਕੇ ਕਨੈਕਸ਼ਨ ਦੇ ਪਿੱਛੇ ਕੋਈ ਐਪ ਕਾਲ ਹੀ ਨਹੀਂ ਹੁੰਦੀ, ਇਸ ਲਈ ਸਥਿਤੀ ਸਕ੍ਰੀਨ ਨੂੰ ਕੁਝ ਵੀ ਖਿੱਚਣ ਤੋਂ ਪਹਿਲਾਂ ਅਜੇ ਵੀ ਤਰਜੀਹਾਂ ਲੋਡ ਕਰਨੀਆਂ ਪੈਂਦੀਆਂ ਹਨ।

ਸੰਬੰਧਿਤ ਲੇਖ