Pregunta

Tengo una aplicación, y me gustaría volver a dirigir a los usuarios a páginas diferentes en función de dónde están navegando a.

Si la navegación desde clip web, no redirigir. Si la navegación de Safari móvil, redirigir a safari.aspx. Si la navegación desde cualquier otro lugar, redirección a unavailable.aspx

I fue capaz de utilizar iPhone Aplicaciones Web, ¿hay una manera de detectar la forma en que se cargó? Pantalla de Inicio vs Safari? para determinar si el usuario navegaba desde un clip web, pero estoy teniendo problemas para determinar si el usuario navega desde Safari móvil 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";
}
¿Fue útil?

Solución

Actualizar : Esta es una respuesta muy vieja y no puedo borrarlo porque la respuesta se acepta. Marcar la respuesta del inconsciente debajo una solución mejor.


debe ser capaz de comprobar la "iPad" o "iPhone" subcadena en el agente de usuario cadena:

var userAgent = window.navigator.userAgent;

if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i)) {
   // iPad or iPhone
}
else {
   // Anything else
}

Otros consejos

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 inconvenientemente similar:

Chrome

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 verificación para iOS como otras respuestas han sugerido y luego filtro en la materia que hace que el Safari UA único, que yo 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);

mejor práctica es:

function isMobileSafari() {
    return navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/)
}

La caída de código sólo se encontró Safari Mobile 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)

Se fusionó todas las respuestas y comentarios. Y este es el resultado.

function iOSSafari(userAgent)
{
    return /iP(ad|od|hone)/i.test(userAgent) && /WebKit/i.test(userAgent) && !(/(CriOS|FxiOS|OPiOS|mercury)/i.test(userAgent));
}



var iOSSafari = /iP(ad|od|hone)/i.test(window.navigator.userAgent) && /WebKit/i.test(window.navigator.userAgent) && !(/(CriOS|FxiOS|OPiOS|mercury)/i.test(window.navigator.userAgent));

Al ver todas las respuestas, he aquí algunos consejos acerca de las expresiones regulares propuestas:

  • AppleWebKit coincide escritorio Safari también (no sólo móvil)
  • hay necesidad de .match llamado más de una vez para tales expresiones regulares simples, y prefieren el método .test más ligero.
  • el g bandera (global) de expresiones regulares es inútil mientras que el i (mayúsculas y minúsculas) puede ser útil
  • sin necesidad de captura (entre paréntesis), sólo estamos probando la cadena

Estoy usando este desde que obtuvo true para móviles Chrome está bien para mí (mismo comportamiento):

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

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

En realidad, no hay una bala de plata de detectar Safari móvil. Hay un buen número de navegadores pueden hacer uso de las palabras clave del agente de usuario de Safari móvil. Tal vez usted puede intentar la detección de accidentes y mantener la actualización de la regla.

Me upvoted @unwitting respuesta 's, ya que, inevitablemente, me consiguió que iba. Sin embargo, cuando se representa mi SPA en un IOS Webview, tenía que ajustar 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);
};

El ser diferencia principal, el cambio de nombre de webkit a webkitUa, a fin de evitar chocar con el objeto webkit raíz utilizada como un controlador de mensajes entre el SPA & UIView.

function isIOS {
  var ua = window.navigator.userAgent;
  return /(iPad|iPhone|iPod).*WebKit/.test(ua) && !/(CriOS|OPiOS)/.test(ua);
}

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

que necesitaba para detectar cuando un usuario navega desde el escritorio de Safari (Debido a que estamos en medio de 2017, y Apple no ha dar ningún apoyo a input[type="date"] aún ...

Por lo tanto, hice un selector de fecha de encargo de reserva para él). Sin embargo, sólo se aplica a safari en el escritorio porque ese tipo de entrada funciona bien en Safari móvil. Por lo tanto, hice esta expresión regular para detectar sólo escritorio Safari. Ya lo probé y no coincide con Opera, Chrome, Firefox o Safari móvil.

La esperanza puede ayudar a algunos de ustedes.

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

Yo estaba buscando esta respuesta y recordé me encontré con esto antes.

La forma más fiable para detectar Safari en iOS en JavaScript es

if (window.outerWidth === 0) {
    // Code for Safari on iOS
} 

or 

if (window.outerHeight === 0) {
    // Code for Safari on iOS
} 

Por alguna razón Safari en iOS devuelve 0 para la propiedad y la propiedad window.outerHeight window.outerWidth.

Esto es para todos los iPads y iPhones en todas las versiones de IOS. Cada otro navegador y dispositivo de esta propiedad funciona normalmente.

No estoy seguro si tienen la intención de cambiar esto, pero por ahora funciona bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top