Está o iPhone nunha VPN? O que unha app de iOS pode ver de verdade
Non hai unha única bandeira de VPN no SDK de iOS. Unha app só pode observar a súa propia configuración, unha notificación de estado e unha instantánea de proxy de alcance limitado.
Pregunte a unha app de iOS se o teléfono está nunha VPN e a resposta honesta é que non pode sabelo no sentido que vostede quere. O SDK non expón ningunha bandeira de «o dispositivo está nun túnel», e as interfaces privadas que poderían achegarse están pechadas para as apps que se publican. Pode observar a configuración da súa propia app, o estado asociado a ela e un ou dous indicios indirectos da pila de rede. Cada un responde a unha pregunta distinta, e a maioría das comprobacións rotas veñen de tomar un deles como a resposta completa.
O mito da bandeira única de VPN
A crenza é que nalgún lugar do SDK hai unha propiedade que informa de se o dispositivo está nun túnel, igual que unha bandeira de alcanzabilidade informa de se un host responde. Esa propiedade pública non existe. E aínda que existise, «hai un túnel» e «o meu tráfico úsao» son afirmacións distintas, e só a segunda importa á maioría das apps.
Ese oco é a razón pola que as bibliotecas que anuncian un detector de VPN dunha liña adoitan ler algo fráxil, como un nome de interface ou unha clave de proxy, e presentalo como un veredicto.
Cargue as preferencias antes de confiar nun nil
A instancia compartida do xestor existe en canto a pide, pero a súa propiedade de protocolo segue sendo nil ata que remata a chamada de carga. Así que un protocolo nil significa «aínda non cargado» polo menos coa mesma frecuencia que «non instalado». Faga a lectura dentro do bloque de finalización e só entón decida: un obxecto de protocolo que existe, coa bandeira de habilitación activada, é o aspecto de «instalado».
Un segundo sinal está no obxecto de conexión: o estado non válido, que o sistema informa cando esta app non ten ningunha configuración instalada. Un estado non válido xunto cun protocolo nil tras unha carga completada é unha ausencia real, non unha carreira de tempos.
Os cambios de conexión chegan como notificacións
Os manexadores que se pasan a load e save informan do que ocorreu coa configuración, non do que fai o túnel. Esperar a que un deles se dispare ao conectar é unha carreira que nunca se resolve. Observe no seu lugar a notificación de cambio de estado e lea o valor actual do obxecto de conexión cando chega.
Unha vez instalada unha configuración, o estado de conexión percorre unha secuencia curta: desconectado, conectando, conectado, reafirmando, desconectando. «Conectado» describe o túnel e non o servidor que hai detrás, así que non é proba de que o tráfico flúa. On-demand tamén pode levantar un túnel mentres a app está suspendida, e entón a notificación chega antes de que teña nada que actualizar.
A instantánea de proxy de alcance limitado é un indicio, non un veredicto
CFNetwork pode dar á app a configuración de proxy actual do sistema, e dentro dese resultado hai un dicionario de alcance limitado con clave por nome de interface. Ver un nome que comeza por tun, utun, ppp, ipsec ou tap é un indicio de que hai un túnel. Segue sendo unha instantánea do que esta app pode ver, non unha afirmación sobre por onde viaxan os paquetes.
Os provedores non se poñen de acordo nos nomes, así que un prefixo ausente non demostra nada, e unha interface presente pode existir sen levar tráfico. A alcanzabilidade é aínda máis feble: unha petición correcta a un enderezo privado mostra que a ruta funcionou para esa petición nese momento, non que haxa unha VPN instalada.
O simulador toma prestado o Mac, e as demais apps quedan invisibles
O simulador non ten pila de rede propia; cada conexión que fai é a do Mac. Por tanto, unha VPN que corre no Mac anfitrión xa está en vigor para a app simulada, e os axustes do propio simulador non mostran nada. Se o túnel se levantou despois de iniciar o simulador, reinicialo adoita ser máis rápido que depurar a app. Un anfitrión nun porto non estándar necesita ese porto na URL, ou unha redirección local como socat TCP-LISTEN:12345,fork TCP:host:12345.
As API públicas non enumerarán perfís de VPN que pertencen a outras apps ou a perfís de configuración. Para unha app coñecida, a proba de esquema de URL mediante canOpenURL é o truco portátil, e desde iOS 9 o esquema consultado debe declararse no seu Info.plist; se o omite, a chamada devolve false. OpenVPN Connect responde a openvpn://, o que o converte nun bo exemplo e nun mal detector xeral.
Combine tres observacións e diga que significan
Apile tres resultados na práctica: unha configuración que se cargou e está habilitada, un estado de conexión que non é non válido e unha petición a un enderezo só alcanzable polo túnel. Cada un engana por separado; xuntos din o que a app pode saber en lugar do que o usuario supón.
Escriba o resultado como tres liñas nos seus diagnósticos, non como un só booleano. Cando un usuario di que a VPN está desactivada mentres a súa app non está de acordo, as tres liñas mostran que observación diverxiu, e esa é a diferenza entre un tícket de soporte sobre o que pode actuar e un que remata en «a min funciona».