J'ai une application et j'aimerais rediriger les utilisateurs vers différentes pages en fonction de l'endroit où ils naviguent.
Si vous naviguez à partir d’un clip Web, ne redirigez pas . Si vous naviguez depuis Safari mobile, redirigez-le vers safari.aspx . Si vous naviguez de partout ailleurs, redirigez-vous vers le fichier indisponible.aspx
J'ai pu utiliser les applications Web iPhone, existe-t-il un moyen de détecter le mode de chargement? Écran d'accueil vs Safari? pour déterminer si l'utilisateur naviguait à partir d'un clip Web, mais je ne parviens pas à déterminer s'il a navigué depuis Safari mobile sur un iPhone ou un 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";
}
UPDATE: C'est une très vieille réponse et je ne peux pas la supprimer car la réponse est acceptée. Vérifiez réponse involontaire ci-dessous pour une meilleure solution.
Vous devriez pouvoir vérifier la chaîne "iPad" ou "iPhone" dans le user agent string:
var userAgent = window.navigator.userAgent;
if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i)) {
// iPad or iPhone
}
else {
// Anything else
}
la meilleure pratique est:
function isMobileSafari() {
return navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/)
}
Le code en baisse ne trouve que les safaris mobiles et rien d’autre (sauf les dauphins 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 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));
Voyant toutes les réponses, voici quelques conseils sur les RegEx proposés:
AppleWebKit
correspond également à Desktop Safari (pas seulement mobile).match
plus d'une fois pour de telles expressions rationnelles simples, et préférez la méthode plus légère .test
.g
(global) est inutile alors que le i
(insensible à la casse) peut être utileJ'utilise cela depuis que true
pour Chrome mobile me convient (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)
J'ai voté la réponse de @unwitting, car elle m'a inévitablement fait avancer. Cependant, lors du rendu de mon SPA dans une vue Web iOS, je devais le modifier légèrement.
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 différence principale étant le changement de nom de webkit
en webkitUa
, afin d'éviter tout conflit avec l'objet racine webkit
utilisé comme gestionnaire de messages entre SPA & UIView.
En fait, il n’ya pas de solution miracle pour détecter un safari mobile. Il existe de nombreux navigateurs qui peuvent utiliser les mots-clés de l'agent utilisateur de Safari mobile. Peut-être que vous pouvez essayer la détection de fonctionnalités et continuer à mettre à jour la règle.
Je sais que c'est un vieux fil, mais j'aimerais partager ma solution avec vous les gars.
Je devais détecter quand un utilisateur naviguait depuis Desktop Safari (car nous sommes au milieu de 2017, et Apple ne fournit aucun support pour input[type="date"]
ENCORE ...
Donc, j'ai fait un sélecteur de date personnalisé de secours). Mais ne s'applique qu'à Safari dans le bureau, car ce type d'entrée fonctionne correctement dans Safari mobile. J'ai donc créé cette Regex pour détecter uniquement le bureau Safari. Je l'ai déjà testé et il ne correspond pas à Opera, Chrome, Firefox ou Safari Mobile.
J'espère que cela 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 rappelé que je l'avais déjà vue auparavant.
Le moyen le plus fiable de 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 pour les propriétés window.outerHeight et window.outerWidth.
Ceci est valable pour tous les iPad et iPhone 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.
function isIOS {
var ua = window.navigator.userAgent;
return /(iPad|iPhone|iPod).*WebKit/.test(ua) && !/(CriOS|OPiOS)/.test(ua);
}