определить Ipad / Iphone веб-просмотра с помощью JavaScript - PullRequest
86 голосов
/ 16 декабря 2010

Есть ли способ отличить с помощью javascript, если веб-сайт работает внутри ipad Safari или внутри приложения WebView?

Ответы [ 14 ]

76 голосов
/ 16 апреля 2012

Агенты пользователей

Запуск в UIWebView

Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/98176

Запуск в Safari на iPad

Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3

Запуск в Safari на Mac OS X

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.5 Safari/534.55.3

Запуск в Chrome в Mac OS X

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19

Запуск в FireFox в Mac OS X

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0

Код обнаружения

var is_uiwebview = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent);
var is_safari_or_uiwebview = /(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent);
74 голосов
/ 31 марта 2012

Используется комбинация window.navigator.userAgent и window.navigator.standalone. Он может различать все четыре состояния, относящиеся к веб-приложению iOS: safari (браузер), автономный (полноэкранный), uiwebview и не iOS.

Демо: http://jsfiddle.net/ThinkingStiff/6qrbn/

var standalone = window.navigator.standalone,
    userAgent = window.navigator.userAgent.toLowerCase(),
    safari = /safari/.test( userAgent ),
    ios = /iphone|ipod|ipad/.test( userAgent );

if( ios ) {
    if ( !standalone && safari ) {
        //browser
    } else if ( standalone && !safari ) {
        //standalone
    } else if ( !standalone && !safari ) {
        //uiwebview
    };
} else {
    //not iOS
};
10 голосов
/ 21 июня 2011

Я думаю, что вы можете просто использовать User-Agent.


UPDATE

Страница просматривается с помощью iPhone Safari

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7

попробую через секунду с UIWebView

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Mobile/8B117

Разница в том, что сафари говорит Safari/6531.22.7


Решение

var isSafari = navigator.userAgent.match(/Safari/i) != null;
6 голосов
/ 16 декабря 2010

Да

// is this an IPad ?
var isiPad = (navigator.userAgent.match(/iPad/i) != null);

// is this an iPhone ?
var isiPhone = (navigator.userAgent.match(/iPhone/i) != null);

// is this an iPod ?
var isiPod = (navigator.userAgent.match(/iPod/i) != null);
4 голосов
/ 12 декабря 2016

Я перепробовал все эти решения, но в моем случае это не сработало,
Я собирался обнаружить Telegram внутри Webview. Я заметил, что Safari меняет текст в стиле телефона на ссылку с префиксом «tel:», поэтому я использовал это для написания этого кода, вы можете проверить его: jsfiddle

<!DOCTYPE html>
<html>
<head></head>
<body>
<ul id="phone" style="opacity:0">
    <li>111-111-1111</li>
</ul>
</body>
</html>

<script>

    var html = document.getElementById("phone").innerHTML;

    if (navigator.platform.substr(0,2) === 'iP') {

        if (html.indexOf('tel:') == -1)
            alert('not safari browser');
        else
            alert('safari browser');
    }
    else
        alert('not iOS');
</script>
2 голосов
/ 26 апреля 2018

Обратите внимание, что этот подход не работает для iOS 10 и более старых версий.

В течение весны 2018 года ни один из предложенных методов не работал для меня, поэтому я предложил новый подход (который не основан на userAgent):

const hasValidDocumentElementRatio =
  [ 320 / 454 // 5, SE
  , 375 / 553 // 6, 7, 8
  , 414 / 622 // 6, 7, 8 Plus
  , 375 / 812 // X
  , 414 / 896 // Xs, Xr
  ].some(ratio =>
    ratio === document.documentElement.clientWidth / 
      document.documentElement.clientHeight
  )

const hasSafariInUA = /Safari/.test(navigator.userAgent)

const isiOSSafari = hasSafariInUA && hasValidDocumentElementRatio  // <- this one is set to false for webviews

https://gist.github.com/BorisChumichev/7c0ea033daf33da73306a396ffa174d1

Вы также можете расширить код для устройств iPad, я думаю, что это должно сработать.

Хорошо работал для веб-просмотров Telegram, Facebook, ВКонтакте.

2 голосов
/ 29 сентября 2014

Решение Neoneye больше не работает (см. Комментарии) и может быть упрощено. С другой стороны, тестирование только «Safari» в UA адресует гораздо больше, чем портативные устройства ios.

Это тест, который я использую:

var is_ios = /(iPhone|iPod|iPad).*AppleWebKit.*Safari/i.test(navigator.userAgent);
1 голос
/ 23 октября 2015

Рекомендуется использовать Modernizr и проверять indexeddb, как this .Вы можете перепроверить это с помощью конфигурации пользовательского агента (устройство, ОС, браузер и т. Д.), Но простое обнаружение функций кажется более рекомендуемым.

0 голосов
/ 15 февраля 2019

Working 15.02.19

Другим решением для обнаружения веб-просмотров на iOS является проверка поддержки / существования navigator.mediaDevices.

if (navigator.mediaDevices) {
    alert('has mediaDevices');
} else {
    alert('has no mediaDevices');
}

В моем случае мне не нужно было перехватывать все веб-просмотры, но те, которые не поддерживают вход с камеры / микрофона (Напоминание: оповещения не запускаются в веб-просмотре, поэтому обязательно измените что-нибудь в dom для целей отладки )

0 голосов
/ 21 марта 2017

Я нашел простое решение для обнаружения iPhone или iPad.Это хорошо работает для меня.

var is_iPad = navigator.userAgent.match(/iPad/i) != null;
var is_iPhone = navigator.userAgent.match(/iPhone/i) != null;
    if(is_iPad || is_iPhone == true){
        //perform your action
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...