2010-06-09 6 views
38

У меня есть приложение, и я бы хотел перенаправить пользователей на разные страницы на основе того, с чего они перемещаются.Определите, был ли пользователь перемещен с мобильного Safari

Если вы переходите с веб-клипа, не перенаправляйте его. Если вы перейдете с мобильного Safari, переадресовывайтесь на safari.aspx. Если навигации из любого другого, перенаправлять unavailable.aspx

Я был в состоянии использовать iPhone WebApps, is there a way to detect how it was loaded? 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"; 
} 
+0

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

+0

@Ali этот вопрос не просит то же самое, как этот –

ответ

17

UPDATE: Это очень старый ответ, и я не могу удалить его, потому что ответ принят. Проверьте unwitting's answer below для лучшего решения.


Вы должны быть в состоянии проверить на "IPad" или "iPhone" подстроки в user agent строке:

var userAgent = window.navigator.userAgent; 

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

Это прекрасно работает, спасибо. – Steven

+9

Я думаю, что это не так. Как насчет разных браузеров iOS Safari? Я думаю, что это выражение исключает не только Safari, но и все браузеры iphone/ipad. – Kamilius

+12

Это неправильный ответ, потому что если я получу доступ к нему из chrome для ios, он вернет true –

27

лучшая практика:

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

Это также подходит для Chrome iOS :( http://stackoverflow.com/a/13808053/668157 – httpete

+0

Это также обнаруживает мобильный хром. – sean

+0

Как мы можем различать iOS Safari и iOS Chrome? Любые идеи? –

1

На самом деле, ISN это серебряная пуля обнаружения мобильного сафари. Существует довольно много браузеров, которые могут использовать ключевые слова пользовательского агента мобильного сафари. Возможно, вы можете попробовать функцию обнаружения и продолжить обновление правила.

+1

Нет, например, в моем случае. Я хочу показать собственный смарт-баннер, сделанный для iOS + Chrome, но не показывать этот баннер на iOS + Safari, потому что iOS + Safari уже есть встроенный смарт-баннер. – JobaDiniz

+0

@JobaDiniz Я знаю, что многие люди хотят что-то делать только в мобильном сафари, но не в других браузерах, так что я тоже. Однако, по сути, браузеры, которые соответствуют токенам типа «iPad», «iOS», «iPhone» .etc не означает, что они являются мобильным сафари, возможно, это некоторые другие браузеры для iOS. Например, просмотр UC и QQ в Китае. Все эти браузеры могут использовать ядро ​​сафари, и большинство действий - это то же самое, что и мобильное сафари, но некоторые нет. Это отстой. – Light

+0

Это действительно отстой. Глупый из меня я надеялся, что navigator.appname будет другим, все браузеры iOS - это «Netscape». Тем не менее, Safari является единственным, кто может устанавливать конфигурационные профили, поэтому, если какой-либо другой получает .mobileconfig, он загружает его и выглядит глупо, потому что он не знает, какое приложение может его открыть ... –

84

См https://developer.chrome.com/multidevice/user-agent#chrome_for_ios_user_agent - строки агента пользователя для Safari на прошивку и для Chrome на прошивке является неудобно похоже:

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

Похоже, что лучший подход здесь - прежде всего проверить 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); 
+2

Это очень хороший ответ. Я не знаю, почему это неправильный ответ ... – fabricioflores

+1

@fabricioflores c'est la vie :( – unwitting

+4

+1 Единственный ответ здесь, который охватывал все спецификации. Я бы просто изменил регулярное выражение iOS на '/ iP (ad | hone)/i', так что вам не нужно или. – sareed

4

Падение код только найти мобильное сафари и ничего (кроме дельфинов и других небольших браузеров)

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

Это единственное, что отличает Firefox и Opera от iOS. –

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

Объединять все ответы и комментарии. И это результат.

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

Я предполагаю, что это также соответствует настольному сафари ('WebKit') – antoine129

+1

@ antoine129 Нет, это не так (проверено на OS X El Capitan) - regexzzzz AND и я думаю, что Desktop Safari никогда не отправляет iP * ... –

2

Видя все ответы, вот несколько советов о предлагаемых регулярных выражениях:

  • AppleWebKit спичка Desktop Safari тоже (не только мобильный)
  • нет необходимости вызывать более .match чем один раз для таких простых регулярных выражений, и предпочитают более легкий метод .test.
  • (глобальное) флаг регулярного выражения g бесполезно в то время как i (чувствительно к регистру) может быть полезным
  • нет необходимости захвата (скобка), мы не только тестирования строки

Я просто с помощью это, так как получение true для мобильного Chrome нормально для меня (то же самое поведение):

/iPhone|iPad|iPod/i.test(navigator.userAgent) 

(я просто хочу, чтобы обнаружить, если устройство является мишенью для приложения IOS)

+1

Важные замечания о регулярных выражениях (в общем), спасибо, что указали здесь (где большинство ошибочно)! В дополнение к вашему ответу, в настоящее время необходимо проверить '! Window.MSStream', а также исключить браузеры Microsoft в соответствии с [этим ответом] (https://stackoverflow.com/a/9039885/89818) на другой вопрос. И '! /CriOS/.test (navigator.userAgent)' предназначен для тех, кто хочет отфильтровать Chrome в соответствии с [этим ответом] (https://stackoverflow.com/a/13808053/89818). – caw

1

Я поддержал ответ @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.

0

Я знаю, что это старая нить, но я хотел бы поделиться своим решением с вами, ребята.

мне нужно, чтобы определить, когда пользователь переходит из рабочего стола Safari (Потому что мы в середине 2017 года, и компания Apple не дает никакой поддержки input[type="date"] ЕЩЕ ...

Итак, я сделал запасной пользовательский DatePicker для этого) . Но применяется только к сафари на рабочем столе, потому что этот тип ввода отлично работает в мобильном 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(); 
    }) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^