javascript redirect to - Determine si el usuario navegó desde Safari móvil





5 Answers

Vea https://developer.chrome.com/multidevice/user-agent#chrome_for_ios_user_agent - las cadenas de agente de usuario para Safari en iOS y para Chrome en iOS son inconvenientes similares:

Cromo

Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3

Safari

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3

Parece que el mejor enfoque aquí es, en primer lugar, verificar iOS para ver si otras respuestas han sugerido y luego filtrar las cosas que hacen que Safari UA sea único, lo que sugeriría que se logra mejor con "es AppleWebKit y no es CriOS":

var ua = window.navigator.userAgent;
var iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);
var webkit = !!ua.match(/WebKit/i);
var iOSSafari = iOS && webkit && !ua.match(/CriOS/i);
mobile site noscript

Tengo una aplicación y me gustaría redirigir a los usuarios a diferentes páginas según el lugar desde el que navegan.

Si navega desde un clip web, no redirija. Si navega desde Safari móvil, redirija a safari.aspx. Si navega desde cualquier otro lugar, redirija a no disponible.aspx

Pude utilizar las aplicaciones web de iPhone, ¿hay alguna forma de detectar cómo se cargó? Pantalla de Inicio vs Safari? para determinar si el usuario estaba navegando desde un clip web, pero tengo problemas para determinar si el usuario navegó desde Safari para dispositivos móviles en un iPhone o iPod.

Esto es lo que tengo:

if (window.navigator.standalone) {
    // user navigated from web clip, don't redirect
}
else if (/*logic for mobile Safari*/) {
    //user navigated from mobile Safari, redirect to safari page
    window.location = "safari.aspx";
}
else {
    //user navigated from some other browser, redirect to unavailable page
    window.location = "unavailable.aspx";
}



El código que cae solo encuentra el safari móvil y nada más (excepto los delfines y otros navegadores pequeños)

  (/(iPad|iPhone|iPod)/gi).test(userAgent) &&
  !(/CriOS/).test(userAgent) &&
  !(/FxiOS/).test(userAgent) &&
  !(/OPiOS/).test(userAgent) &&
  !(/mercury/).test(userAgent)



Al ver todas las respuestas, aquí hay algunos consejos sobre los RegExes propuestos:

  • AppleWebKit coincide con Desktop Safari (no solo móvil)
  • no es necesario llamar a .match más de una vez para obtener expresiones regulares simples, y preferir el método .test más .test .
  • el indicador g (global) regex es inútil mientras que el indicador i (insensible a mayúsculas) puede ser útil
  • no hay necesidad de captura (paréntesis), solo estamos probando la cadena

Solo estoy usando esto, ya que ser true para Chrome móvil está bien para mí (el mismo comportamiento):

/iPhone|iPad|iPod/i.test(navigator.userAgent)

(Solo quiero detectar si el dispositivo es un objetivo para una aplicación de iOS)




Aumenté la respuesta de @unwitting, ya que inevitablemente me hizo seguir. Sin embargo, al renderizar mi SPA en una vista web de iOS, necesitaba modificarlo un poco.

function is_iOS () {
    /*
        Returns whether device agent is iOS Safari
    */
    var ua = navigator.userAgent;
    var iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);
    var webkitUa = !!ua.match(/WebKit/i);

    return typeof webkit !== 'undefined' && iOS && webkit && !ua.match(/CriOS/i);
};

La principal diferencia es el cambio de nombre de webkit a webkitUa , para evitar el conflicto con el objeto webkit raíz utilizado como controlador de mensajes entre SPA y UIView.




Sé que este es un hilo viejo, pero me gustaría compartir mi solución con ustedes.

Necesitaba detectar cuándo un usuario navega desde Desktop Safari (porque estamos en la mitad de 2017, y Apple no ha dado soporte para la input[type="date"] AÚN ...

Por lo tanto, hice un selector de fechas personalizado de reserva para ello. Pero solo se aplica a safari en el escritorio porque ese tipo de entrada funciona bien en Safari móvil. Entonces, hice este Regex para detectar solo el Safari de escritorio. Ya lo probé y no coincide con Opera, Chrome, Firefox o Safari Mobile.

Espero que pueda ayudar a algunos de ustedes.

if(userAgent.match(/^(?!.*chrome).(?!.*mobile).(?!.*firefox).(?!.*iPad).(?!.*iPhone).*safari.*$/i)){
  $('input[type="date"]').each(function(){
    $(this).BitmallDatePicker();
  })
}





Related