Определите, был ли пользователь перемещен с мобильного Safari
У меня есть приложение, и я бы хотел перенаправить пользователей на разные страницы в зависимости от того, с чего они перемещаются.
Если переходить с веб-клипа, не перенаправляйте.
Если вы перейдете с мобильного Safari, переадресовывайтесь на safari.aspx.
Если вы переходите из любого места, переадресовывайте его в unavailable.aspx
Я смог использовать iPhone WebApps, есть ли способ определить, как он был загружен? Home Screen vs Safari?, чтобы определить, перемещался ли пользователь из веб-клипа, но у меня возникли проблемы с определением, был ли пользователь перемещен с мобильного Safari на iPhone или iPod.
Вот что у меня есть:
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";
}
Ответы
Ответ 1
ОБНОВЛЕНИЕ: Это очень старый ответ, и я не могу удалить его, потому что ответ принят. Проверьте невольный ответ ниже, чтобы найти лучшее решение.
Вы должны быть в состоянии проверить подстроку "iPad" или "iPhone" в строке агента пользователя :
var userAgent = window.navigator.userAgent;
if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i)) {
// iPad or iPhone
}
else {
// Anything else
}
Ответ 2
См. https://developer.chrome.com/multidevice/user-agent#chrome_for_ios_user_agent - строки пользовательского агента для Safari в iOS и для Chrome на iOS неудобно похожи:
Хром
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
Сафари
Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3
Похоже, что лучший подход здесь - это прежде всего проверить iOS, как предложили другие ответы, а затем отфильтровать материал, который делает уникальным Safari UA, который я бы предложил лучше всего сделать с помощью "AppleWebKit" и не является 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);
Ответ 3
Лучшая практика:
function isMobileSafari() {
return navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/)
}
Ответ 4
Падение кода позволяет найти только сафари для мобильных устройств и больше ничего (кроме дельфинов и других небольших браузеров)
(/(iPad|iPhone|iPod)/gi).test(userAgent) &&
!(/CriOS/).test(userAgent) &&
!(/FxiOS/).test(userAgent) &&
!(/OPiOS/).test(userAgent) &&
!(/mercury/).test(userAgent)
Ответ 5
Объединил все ответы и комментарии.
И это результат.
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));
Ответ 6
Увидев все ответы, вот несколько советов о предлагаемых RegExes:
-
AppleWebKit
соответствует также Safari рабочего стола (не только для мобильных устройств)
- не нужно вызывать
.match
более одного раза для таких простых регулярных выражений и предпочитает более легкий .test
метод.
- флаг
g
(global) regex бесполезен, в то время как i
(без учета регистра) может быть полезным
- нет необходимости в захвате (скобки), мы просто проверяем строку
Я просто использую это, так как получение true
для мобильного Chrome для меня в порядке (такое же поведение):
/iPhone|iPad|iPod/i.test(navigator.userAgent)
(Я просто хочу определить, является ли устройство целью для приложения iOS)
Ответ 7
На самом деле, нет серебряной пули для обнаружения мобильного сафари. Существует довольно много браузеров, которые могут использовать ключевые слова пользовательского агента мобильного сафари. Возможно, вы можете попробовать функцию обнаружения и продолжить обновление правила.
Ответ 8
Я поддержал ответ @unwitting, так как это неизбежно заставило меня идти. Однако при рендеринге моего SPA в iOS Webview мне нужно было немного его подстроить.
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);
};
Основное различие заключается в переименовании webkit
в webkitUa
, чтобы предотвратить столкновение с корневым объектом webkit
, используемым в качестве обработчика сообщений между SPA и UIView.
Ответ 9
function isIOS {
var ua = window.navigator.userAgent;
return /(iPad|iPhone|iPod).*WebKit/.test(ua) && !/(CriOS|OPiOS)/.test(ua);
}
Ответ 10
Я знаю, что это старый поток, но я хотел бы поделиться своим решением с вами, ребята.
Мне нужно было обнаружить, когда пользователь переходит из Desktop Safari (потому что мы находимся в середине 2017 года, и Apple не дает поддержки для input[type="date"]
YET...
Итак, я сделал для него резервный пользовательский датпикер). Но применяется только к сафари на рабочем столе, потому что этот тип ввода отлично работает в мобильном Safari. Итак, я сделал это Regex только для обнаружения рабочего стола Safari. Я уже тестировал его, и он не соответствует Opera, Chrome, Firefox или Safari Mobile.
Надеюсь, это поможет некоторым из вас, ребята.
if(userAgent.match(/^(?!.*chrome).(?!.*mobile).(?!.*firefox).(?!.*iPad).(?!.*iPhone).*safari.*$/i)){
$('input[type="date"]').each(function(){
$(this).BitmallDatePicker();
})
}
Ответ 11
Я искал этот ответ и вспомнил, что сталкивался с этим раньше.
Самый надежный способ обнаружить Safari на iOS в JavaScript - это
if (window.outerWidth === 0) {
// Code for Safari on iOS
}
or
if (window.outerHeight === 0) {
// Code for Safari on iOS
}
По какой-то причине Safari на iOS возвращает 0 для свойства window.outerHeight и свойства window.outerWidth.
Это для всех iPad и iPhone на всех версиях iOS. В любом другом браузере и устройстве это свойство работает нормально.
Не уверен, намерены ли они изменить это, но пока это работает хорошо.
Ответ 12
это регулярное выражение работает для меня, чисто и просто
const isIOSSafari = !! window.navigator.userAgent.match(/Version/[\ d.]+. * Safari/);