Подтвердить что ты не робот

Определите, был ли пользователь перемещен с мобильного 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";
}
4b9b3361

Ответ 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/);