2010-06-09 7 views
38

J'ai une application, et je voudrais rediriger les utilisateurs vers des pages différentes en fonction de l'endroit d'où ils naviguent.Déterminer si l'utilisateur a navigué à partir de mobiles Safari

Si vous naviguez à partir d'un clip Web, ne le redirigez pas. Si vous naviguez à partir de Safari mobile, redirigez-le vers safari.aspx. Si la navigation de nulle part ailleurs, rediriger vers unavailable.aspx

j'ai pu utiliser iPhone WebApps, is there a way to detect how it was loaded? Home Screen vs Safari? pour déterminer si l'utilisateur naviguait d'un clip web, mais je vais avoir du mal à déterminer si l'utilisateur navigue de Safari mobile sur un iPhone ou iPod.

Voici 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"; 
} 
+0

http://stackoverflow.com/questions/9038625/detect-if-device-is-ios – Ali

+0

@Ali cette question ne demande pas la même chose que celui-ci –

Répondre

17

MISE À JOUR: Ceci est une réponse très ancienne et je ne peux pas le supprimer parce que la réponse est acceptée. Vérifiez unwitting's answer below pour une meilleure solution.


Vous devriez être en mesure de vérifier la "iPad" ou substring "iPhone" dans la chaîne user agent:

var userAgent = window.navigator.userAgent; 

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

Cela fonctionne très bien, merci. – Steven

+9

Je pense que ce n'est pas le cas. Qu'en est-il des navigateurs iOS différents de Safari? Je pense que cette expression exclura non seulement Safari, mais tous les navigateurs iphone/ipad. – Kamilius

+12

ce n'est pas la bonne réponse parce que si j'accède à partir de chrome pour ios il retournera vrai –

27
meilleures pratiques

est:

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

Cela correspondrait également pour Chrome iOS :( http://stackoverflow.com/a/13808053/668157 – httpete

+0

Ceci détecte également le chrome mobile – sean

+0

Comment faire la différence entre iOS Safari et iOS Chrome alors? Des idées? –

1

En fait, il n une balle d'argent de détection de safari mobile. Il y a quelques navigateurs qui peuvent utiliser les mots-clés de l'agent utilisateur du safari mobile. Peut-être que vous pouvez essayer la détection de fonctionnalités et continuer à mettre à jour la règle.

+1

Non dans mon cas, par exemple Je veux montrer une bannière intelligente personnalisée faite pour iOS + Chrome, mais ne pas montrer cette bannière sur iOS + Safari, car iOS + Safari déjà J'ai une bannière intelligente intégrée – JobaDiniz

+0

@JobaDiniz Je sais que beaucoup de gens veulent faire quelque chose juste en safari mobile mais pas dans d'autres navigateurs, moi aussi. En fait, les navigateurs qui correspondent à des jetons comme "iPad", "iOS", "iPhone" .etc ne signifie pas qu'ils sont mobiles, peut-être qu'ils sont d'autres navigateurs pour iOS.Par exemple, UC et QQ parcourir rs en Chine. Tous ces navigateurs peuvent utiliser le noyau du safari et la plupart des comportements sont les mêmes que les safaris mobiles, mais pas tous. Ça craint. – Light

+0

Ça craint en effet. Folie de moi J'avais espéré que navigator.appname serait différent, tous les navigateurs d'iOS sont 'Netscape'. Pourtant, Safari est le seul capable d'installer des profils de configuration, donc si un autre obtient un .mobileconfig, il le télécharge et a l'air stupide car il ne sait pas quelle application peut l'ouvrir ... –

84

Voir https://developer.chrome.com/multidevice/user-agent#chrome_for_ios_user_agent - les chaînes de l'agent utilisateur pour Safari sur iOS et pour Chrome sur iOS sont incommode 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

On dirait que la meilleure approche ici est de vérifier tout d'abord pour iOS comme d'autres réponses ont suggéré, puis filtrer sur les choses qui rendent Safari UA unique, qui je pense est mieux accompli avec "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); 
+2

C'est une très bonne réponse. Je ne sais pas pourquoi ce n'est pas la bonne réponse ... – fabricioflores

+1

@fabricioflores c'est la vie :( – unwitting

+4

+1 La seule réponse ici qui a couvert toutes les spécifications Je changerais juste le regex d'essai d'iOS en '/ iP (ad | hone)/i' donc vous n'avez pas besoin du ou – sareed

4

Code chute trouver seulement safari mobile et rien d'autre (à l'exception des dauphins et autres petits navigateurs)

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

Ceci est le seul qui différencie Firefox et Opera sur iOS. –

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

Fusionné toutes les réponses et commentaires. Et voici 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)); 
+0

Je suppose que cela correspond également safari de bureau ('WebKit') – antoine129

+1

@ antoine129 Non, il ne fonctionne pas (testé sur OS X El Capitan) - les regexzzzz sont AND et je suppose que Desktop Safari n'envoie jamais iP * ... –

2

Voir toutes les réponses, voici quelques conseils sur les Regexes proposées:

  • AppleWebKit les matches de bureau Safari trop (non seulement mobile)
  • pas besoin d'appeler .match plus d'une fois pour une telle simples regex, et préfèrent la méthode .test plus légère.
  • le g (global) regex est inutile alors que le i (insensible à la casse) peut être utile
  • pas besoin de capture (entre parenthèses), nous testons juste la chaîne

Je suis juste en utilisant cela depuis l'obtention true pour Chrome mobile 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)

+1

Remarques importantes sur les expressions régulières (en général), merci de le signaler ici (où la plupart se sont trompés)! En plus de votre réponse, on devrait maintenant vérifier '! Window.MSStream' ainsi que d'exclure les navigateurs de Microsoft selon [cette réponse] (https://stackoverflow.com/a/9039885/89818) à une autre question. Et '! /CriOS/.test (navigator.userAgent)' est pour ceux qui veulent filtrer Chrome selon [cette réponse] (https://stackoverflow.com/a/13808053/89818). – caw

1

J'ai repoussé la réponse de @unwitting, car elle m'a inévitablement amené. Cependant, lors du rendu de mon SPA dans une 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-webkitUa, de manière à empêcher heurtant à l'objet racine webkit utilisé comme un gestionnaire de messages entre le SPA & UIView.

0

Je sais que c'est un vieux fil de discussion, mais j'aimerais partager ma solution avec vous.

je devais détecter lorsqu'un utilisateur navigue de bureau Safari (Parce que nous sommes au milieu 2017, et Apple a donner aucun soutien pour input[type="date"] ... PAS ENCORE

Alors, je fait un datepicker personnalisé fallback pour ça) . Mais s'applique uniquement à 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 ne détecter que Safari de bureau. Je l'ai déjà testé et il ne correspond pas à Opera, Chrome, Firefox ou Safari Mobile.

J'espère que cela pourrait aider certains d'entre vous.

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