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";
}
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
}
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);
meilleure pratique est:
function isMobileSafari() {
return navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/)
}
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)
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));
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 drapeaui
(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)
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.
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.
function isIOS {
var ua = window.navigator.userAgent;
return /(iPad|iPhone|iPod).*WebKit/.test(ua) && !/(CriOS|OPiOS)/.test(ua);
}
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();
})
}
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.