Déterminer si l'utilisateur navigue depuis un Safari mobile

j'ai une application, et je voudrais rediriger les internautes vers des pages différentes en fonction de leur navigation.

si vous naviguez à partir de web clip, ne redirigez pas. Si vous naviguez à partir de Safari mobile, redirigez vers safari.aspx. Si vous naviguez de n'importe où ailleurs, redirigez vers indisponible.aspx 151920920"

j'ai été en mesure d'utiliser WebApps iPhone, est-il un moyen de détecter la façon dont il a été chargé? Écran d'accueil vs Safari? pour déterminer si l'utilisateur naviguait à partir d'un clip web, mais j'ai du mal à déterminer si l'Utilisateur a navigué à partir de Safari mobile sur un iPhone ou un iPod.

voilà ce que j'ai:

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";
}
44
demandé sur Community 2010-06-09 19:48:03

11 réponses

UPDATE : c'est une réponse très ancienne et je ne peux pas la supprimer parce que la réponse est acceptée. Cochez la case sous pour obtenir une meilleure solution.


vous devriez être en mesure de vérifier pour le "iPad" ou "iPhone" substrat dans le agent utilisateur chaîne de caractères:

var userAgent = window.navigator.userAgent;

if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i)) {
   // iPad or iPhone
}
else {
   // Anything else
}
19
répondu Daniel Vassallo 2017-05-23 12:26:11

voir https://developer.chrome.com/multidevice/user-agent#chrome_for_ios_user_agent - les chaînes d'agent utilisateur pour Safari sur iOS et pour Chrome sur iOS sont difficilement similaires:

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

ressemble à la meilleure approche ici est d'abord Vérifiez iOS comme d'autres réponses l'ont suggéré et filtrez ensuite sur les choses qui rendent la Safari UA unique, ce qui je dirais est le mieux accompli avec "Is AppleWebKit et n'est pas 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);
99
répondu unwitting 2017-06-28 08:47:08

meilleure pratique est:

function isMobileSafari() {
    return navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/)
}
27
répondu appsthatmatter 2011-02-08 13:23:43

code de chute trouver safari mobile et rien d'autre (sauf dauphin et autres petits navigateurs)

  (/(iPad|iPhone|iPod)/gi).test(userAgent) &&
  !(/CriOS/).test(userAgent) &&
  !(/FxiOS/).test(userAgent) &&
  !(/OPiOS/).test(userAgent) &&
  !(/mercury/).test(userAgent)
4
répondu aWebDeveloper 2016-01-25 07:44:20

Fusionné toutes les réponses et les commentaires. Et c'est le résultat.

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));
2
répondu K._ 2016-03-05 12:13:24

en voyant toutes les réponses, voici quelques conseils sur les règlements proposés:

  • AppleWebKit correspond Bureau Safari trop (pas mobile)
  • pas besoin d'appeler .match plus d'une fois pour de tels régexes simples, et préfèrent la méthode plus légère .test .
  • le drapeau g (global) regex est inutile tandis que le drapeau i (insensible à la casse) peut être utile
  • pas besoin pour la capture (entre parenthèses), nous testons simplement la chaîne

Je l'utilise simplement car obtenir true pour mobile Chrome est OK pour moi (même comportement):

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

(je veux juste détecter si l'appareil est une cible pour une application iOS)

2
répondu antoine129 2016-09-29 14:35:04

en fait, il n'y a pas de balle en argent pour détecter un safari mobile. Il ya un certain nombre de navigateurs peuvent utiliser les mots-clés de l'agent utilisateur de safari mobile. Peut-être Pouvez-vous essayer la détection de fonctionnalités et continuer à mettre à jour la règle.

1
répondu Light 2014-03-11 08:45:10

j'ai rejeté la réponse de @unwitting, car elle m'a inévitablement fait avancer. Cependant, lorsque je rendais mon SPA Dans un Webview iOS, j'avais besoin de le modifier un peu.

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 principale différence étant le changement de nom de webkit en webkitUa , de façon à éviter les collisions avec la racine de l'objet webkit utilisé comme gestionnaire de messages entre le SPA & UIView.

1
répondu pimbrouwers 2017-02-10 15:01:30
function isIOS {
  var ua = window.navigator.userAgent;
  return /(iPad|iPhone|iPod).*WebKit/.test(ua) && !/(CriOS|OPiOS)/.test(ua);
}
0
répondu Kugutsumen 2016-02-06 16:15:40

je sais que c'est un vieux thread, mais j'aimerais partager ma solution avec vous les gars.

j'avais besoin de détecter quand un utilisateur navigue depuis un Safari de bureau (parce que nous sommes au milieu de 2017, et Apple n'a pas encore donné de support pour input[type="date"] ...

donc, j'ai fait un curseur de secours personnalisé pour elle) . Mais s'applique seulement à safari dans le bureau parce que ce type d'entrée fonctionne très bien dans Safari mobile. Donc, j'ai fait ce Regex pour seulement détecter le Safari de bureau. Je déjà testé et il ne correspond pas avec Opera, Chrome, Firefox ou Safari Mobile.

J'espère que ça peut aider certains d'entre vous.

if(userAgent.match(/^(?!.*chrome).(?!.*mobile).(?!.*firefox).(?!.*iPad).(?!.*iPhone).*safari.*$/i)){
  $('input[type="date"]').each(function(){
    $(this).BitmallDatePicker();
  })
}
0
répondu edd2110 2017-09-23 17:14:12

je cherchais cette réponse et je me suis souvenu que je suis tombé sur ce avant.

le moyen le plus fiable pour détecter Safari sur iOS en JavaScript est

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

or 

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

Pour une raison quelconque Safari sur iOS renvoie 0 en cas de fenêtre.propriété extérieure et fenêtre.outerWidth de la propriété.

c'est pour tous les iPads et iPhones sur toutes les versions d'iOS. Tous les autres navigateurs et périphériques cette propriété fonctionne normalement.

Je ne sais pas s'ils ont l'intention de changer cela, mais pour l'instant cela fonctionne bien.

0
répondu naeluh 2018-03-20 22:00:44