Captive Wifi Popup: haz clic en un enlace para abrir Safari

Estamos teniendo un problema en nuestra networking con dispositivos iOS (ipads, iphones, etc.): después de conectarse al SSID, el iphone / ipad abre inmediatamente el Asistente de networking cautiva (CNA), es como un browser networkingucido sin botones de navigation, etc. – que muestra nuestra página de bienvenida (list para que el usuario autentifique su MAC en la networking para darle internet). Este CNA es una function de iOS y ocurre automáticamente.

Estaba buscando en este foro cómo hacer que el usuario abra su browser Safari haciendo clic en un enlace (mientras está en el CNA), lo que lo envía lejos del CNA y hacia Safari (que es donde preferiría que fuera).

Busqué frases como: "Cómo establecer un enlace para abrir en safari", pero obtengo resultados sobre personas que usan phonegap para hacer tal cosa …
Un usuario habló sobre el uso de window.open (myURL, '_system'), pero no sé si eso está solucionando mi problema.

Básicamente, mi plan es: – Hacer que mi página de bienvenida (la página que se muestra después del usuario conectado a mi SSID) detecte qué tipo de browser tiene el dispositivo del usuario. Mi página de bienvenida se aloja en un sitio que está en el jardín amurallado de mi controller, por lo que todos los dispositivos pueden ver esa página de bienvenida (independientemente de que tengan acceso completo a Internet o no). – Si el usuario tiene un dispositivo iOS, el browser CNA se abre automáticamente. Mi controller detecta que el dispositivo tiene un browser CNA y carga una página simple con el post ("me gusta"): "haga clic aquí para comenzar a navegar". Durante los siguientes segundos (mientras el usuario está digiriendo el post), mi controller le proporciona al usuario Acceso a internet completo de MAC: cuando el usuario hace clic en ese enlace en el browser de CNA, CNA se cierra y luego abre Safari, y también obliga a Safari a abrir la página de bienvenida de destino (donde quiero que sea mi usuario, dependiendo de la antena a la que él conectado).

Realmente espero que todo tenga sentido …

Encontré este enlace sobre el browser CNA en este foro: omite el inicio de session de Apple Captive Network Assistant en iOS 7

Pero dice que el usuario debe abrir Safari desde el principio (deshabilitar la function CNA), "esperar" que el usuario abra Safari (en lugar de ir directamente a una de sus aplicaciones). Prefiero que el usuario tenga que "hacer clic para continuar", lo que hace que Safari se abra y él ve mi página de bienvenida.

Extraído de una respuesta de Ryan en ¿Cómo puedo abrir un enlace externo en Safari, no el UIWebView de la aplicación?

Para que un enlace específico cambie a Safari, simplemente agregue target = "_ system" al enlace, como en

<a href="http://www.domain.com/" target="_system">Link Text</a> 

O para atrapar todos los enlaces en su javascript que tienen target = "_ blank", incluya jQuery y páselos a window.open con el parámetro '_system'. Esto funcionará tanto en iOS como en Android.

 $(document).on('click', 'a[target="_blank"]', function(ev) { var url; ev.preventDefault(); url = $(this).attr('href'); window.open(url, '_system'); }); 

Javascript NO funciona completamente en CNA, está deshabilitado por motivos de security. target = "_ system" es una function de Safari , no CNA. ==> brevemente, _system falla en CNA.

EDITAR : esta solución no funciona después de iOS 10.3. No estoy seguro de si esa es una característica o un error: https://forums.developer.apple.com/thread/75498

EDIT2 : Aparentemente funciona de nuevo en iOS 11


Hay una manera simple de hacerlo, si tiene control sobre el server del portal cautivo.

Al conectarse a una networking wifi, los dispositivos iOS envían una request GET a un grupo de URL pnetworkingefinidas ( http://www.apple.com/library/test/success.html , …), para ver si hay conectividad a Internet (requestes wispr). El dispositivo iOS espera la respuesta <HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML> . Si la request tiene éxito, pero la respuesta es diferente (por ejemplo, la página del portal cautivo), activa el CNA para abrir.

En esta etapa, el CNA cree que no está conectado y mostrará un button Cancel en la parte superior. Cada enlace se abrirá dentro del CNA y no en una window de Safari, sin importar lo que hagas. El CNA está hecho para que pueda get su usuario a través del process de inicio de session. Para ver si el process de inicio de session está hecho y la connection finalmente se establece, el dispositivo iOS enviará de vez en cuando otra request de inteligencia. Esto sucede cada 40 segundos, o cada vez que se emite una request HTTP (navigation dentro de la CNA).

Cuando su server finalmente responda el Success a una request de wispr, el CNA marcará como connected , el button en la parte superior cambiará a Done . En esta etapa, cualquier enlace a una URL externa cerrará la CNA y abrirá en Safari 🙂

Para resumir, puede lograr lo que desea con los siguientes pasos de connection:

  1. server responde la request inicial de wispr con su página de CNA.
  2. La página se abre en CNA. En esa página, tenga algo de JavaScript que desencadene de inmediato la navigation dentro del CNA, por ejemplo: <script>window.location.reload(true)</script> esto activará el dispositivo iOS para enviar inmediatamente otra request wispr
  3. server contesta esta segunda request de wispr con <HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML> , esto activará que el CNA marque como conectado
  4. Haga que su página de CNA muestre un enlace a una URL externa.