виявити ipad / iphone веб-перегляд за допомогою


91

Чи є спосіб відрізнятись за допомогою javascript, якщо веб-сайт працює всередині сафарі ipad або всередині програми WebView?


Це лише для пристроїв iOS?
Nicolas S

Відповіді:


79

Тут використовується комбінація window.navigator.userAgentі window.navigator.standalone. Він може розрізняти всі чотири стани, що стосуються веб-програми iOS: сафарі (браузер), автономний (повноекранний), 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
};

chrome має Safariв userAgent. він поводиться по-різному щодо вимоги webcal://протоколу для файлів
.ics

@svlada ви можете надати більше інформації? Яким був ваш пристрій та його версія iOS?
sonlexqt

78

Агенти користувачів

Запуск в 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);

Дійсно. Не знаю, чому я спочатку просто розглянув обидва корисні речовини. Дякую за вашу відповідь :)
дер.

4
Не працює на iPhone 5s / iOS 7, тому що і користувач, UIWebViewі Safari мають Safariсвого агента користувача
Razor

@Razor Ти маєш рацію. Тестування на Versionпротивагу тому, що Safariпрацювало у мене в останній iOS.
unceus

1
@unceus Чи можете ви, будь ласка, окреслити, як саме ви маєте на увазі Version? Чи є замінити Safariз Versionв var is_uiwebviewлінії?
Генрік Петтерсон,

@HenrikPetterson Щодо рядків агента користувача, порівнюючи перші дві рядки агента користувача вище (UIWebView та Safari на iPad), рядок UIWebView містить "версію", тоді як ipad - ні. Ваша мета модифікації регулярного виразу незрозуміла, і схоже на те, що ви, можливо, шукаєте допомоги в його написанні.
unceus

10

Я думаю, що ви можете просто використовувати User-Agent.


ОНОВЛЕННЯ

Сторінку переглядали за допомогою 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 Safari/6531.22.7


Рішення

var isSafari = navigator.userAgent.match(/Safari/i) != null;

Так, але чи маєте ви уявлення про те, чи існує певний рядок чи щось для виявлення UIWebView в User-Agent? Поки що я не міг нічого знайти ...
Адам Тал

Це лише для пристроїв iOS?
Nicolas S

Ніколас, цифри на даний момент будуть різними, оскільки Safari та UIWebView (і "автономні" - тобто домашній екран - веб-програми) використовують різні механізми. Це зміниться в iOS 5.
Бен,

Я не маю на увазі цифр, я маю на увазі, що Safari/.....саме в UIWebView відсутнє
Nicolas S

@ Ніколас: цілком правильно, вибачте, я не звернув уваги. Цікаво, чи хтось міг підтвердити, чи так це все ще в iOS5?
Бен,

7

Так:

// 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);

11
Це також відповідатиме браузеру Safari, а не лише WebView.
Петр Пеллер,

@ThinkingStuff - Чи не могли б ви допомогти мені допомогти diiferentiate між Mac OS (робочий стіл браузера) і браузер IPad Safari - stackoverflow.com/questions/58344491 / ...
newdeveloper

5

Я спробував усі ці рішення, але в моєму випадку не працював,
я збирався виявити 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>

1
Не слід покладатися на такий фокус, оскільки користувач або будь-який інший розробник може вимкнути виявлення телефону.
Бодров Андрей

@ БодровАндрей Я згоден з вами, але це був єдиний спосіб, який я міг знайти, сподіваюся, apple надасть іншого User-Agent для цього в майбутньому
Amir Khorsandi

Остерігайтеся, що це неможливо на iOS 13, тому що, якщо використовується робочий режим, тоді navigator.platform === 'MacIntel'. Це особливо стосується iPadOS 13 Mobile Safari, оскільки за замовчуванням він використовує робочий режим.
robocat

@robocat ти маєш рацію. він зламався в iOS 13 iPad, і я зараз застряг без рішення. Чи не могли б ви допомогти мені з суміжних питанням тут stackoverflow.com/questions/58344491 / ...
newdeveloper

2

Рішення Neoneye більше не працює (див. Коментарі) і може бути спрощене. З іншого боку, тестування лише "Safari" в UA вирішує набагато більше, ніж портативні пристрої ios.

Це тест, який я використовую:

var is_ios = /(iPhone|iPod|iPad).*AppleWebKit.*Safari/i.test(navigator.userAgent);

2

Зауважте, що такий підхід не працює для 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, VK.


Для iPhone X це буде 375/812, також новий: 414/896 для iPhone Xs Max / Xr
Олег Датер

1

Working 15.02.19

Іншим рішенням для виявлення веб-переглядів на iOS є перевірка підтримки / існування navigator.mediaDevices.

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

У моєму випадку мені не потрібно було переглядати всі веб-перегляди, але ті, які не підтримують вхід камери / мікрофона (нагадування: Сповіщення не запускаються у веб-перегляді, тому переконайтеся, що щось змінилося в будинку для цілей налагодження)


0

Я знаю, що цей код перевірить, чи доступ до нього здійснюється за допомогою значка, доданого на головний екран:

if (window.navigator.standalone == true) {
//not in safari
}

але я не впевнений, як би він реагував у UIWebView. Єдине інше рішення, про яке я міг подумати, - це отримання користувацького агента або використання - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationTypeта заміна рядка запиту сторінки, до якої ви отримуєте доступ, на те, що ця сторінка використовує для ідентифікації доступу до неї з веб-перегляду.


Дякую, я використовував цей код, але потребую додаткового контролю. Здається, він виявляє лише автономний режим, а решту вважає Safari.
Адам Тал

0

Запропонував би використовувати Modernizr та перевіряти індексованість db таким чином . Ви можете перевірити це з конфігурацією агента користувача (пристрій, ОС, браузер тощо), але чисте виявлення функцій видається більш рекомендованим.


Звучить як план, але які функції ви б протестували? indexeddb є частиною ie, chrome, firefox тощо
ССЕД

0

Востаннє мені це було потрібно (ПРОСТО для цілей WebView), я використав цю перевірку:

function isIOS() {
     return !/safari/.test( window.navigator.userAgent.toLowerCase()) || navigator.platform === 'iOS' || navigator.platform === 'iPhone';
}

Це порушено в режимі робочого столу iOS13 (платформа більше не встановлена ​​на iPad або iPhone), а також на iPod touch (платформа може бути "iPod" або "iPod touch").
robocat

0

Я знайшов просте рішення для виявлення 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
    }

0

Спробуйте за допомогою IOS 13

      function mobileDetect() {


    var agent = window.navigator.userAgent;
    var d = document;
    var e = d.documentElement;
    var g = d.getElementsByTagName('body')[0];
    var deviceWidth = window.innerWidth || e.clientWidth || g.clientWidth;

    // Chrome
    IsChromeApp = window.chrome && chrome.app && chrome.app.runtime;

    // iPhone
    IsIPhone = agent.match(/iPhone/i) != null;

    // iPad up to IOS12
    IsIPad = (agent.match(/iPad/i) != null) || ((agent.match(/iPhone/i) != null) && (deviceWidth > 750)); // iPadPro when run with no launch screen can have error in userAgent reporting as an iPhone rather than an iPad. iPadPro width portrait 768, iPhone6 plus 414x736 but would probably always report 414 on app startup

    if (IsIPad) IsIPhone = false;

    // iPad from IOS13
    var macApp = agent.match(/Macintosh/i) != null;
    if (macApp) {
        // need to distinguish between Macbook and iPad
        var canvas = document.createElement("canvas");
        if (canvas != null) {
            var context = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
            if (context) {
                var info = context.getExtension("WEBGL_debug_renderer_info");
                if (info) {
                    var renderer = context.getParameter(info.UNMASKED_RENDERER_WEBGL);
                    if (renderer.indexOf("Apple") != -1) IsIPad = true;
                }
                ;
            }
            ;
        }
        ;
    }
    ;

    // IOS
    IsIOSApp = IsIPad || IsIPhone;

    // Android
    IsAndroid = agent.match(/Android/i) != null;
    IsAndroidPhone = IsAndroid && deviceWidth <= 960;
    IsAndroidTablet = IsAndroid && !IsAndroidPhone;



    message = ""


    if (IsIPhone) {

        message = "Device is IsIPhone"


    }
    else if (IsIPad) {

        message = "Device is ipad"

    } else if (IsAndroidTablet || IsAndroidPhone || IsAndroid) {

        message = "Device is Android"


    } else {

        message = "Device is Mac ||  Windows Desktop"

    }


    return {

        message: message,

        isTrue: IsIOSApp || IsAndroid || IsAndroidTablet || IsAndroidPhone

    }

}



const checkMobile = mobileDetect()

alert(checkMobile.message + "  =====>  " + checkMobile.isTrue)

-2

Я не думаю, що є щось конкретне, що ви можете використовувати в клієнтському Javascript, але якщо у вас є контроль над тим, що може зробити початковий UIWebView, ви можете розглянути можливість відтворення з рядком агента користувача, який він генерує, і тестування на це у вашому клієнтський Javascript замість цього? Я знаю трохи хакерства, але привіт ... Це питання може дати деякі рекомендації щодо налаштування користувацького агента:

Змінити агента користувача в UIWebView (iPhone SDK)


Дякую, Бен. На жаль, я не маю контролю над користувальницьким агентом UIWebView програми.
Адам Тал,

-7

@ Sod, ну, у мене немає відповіді, але я не впевнений, чому ви хочете перевірити, оскільки браузерний механізм, чи його сафарі (браузер) чи додаток буде однаковим лише його Webkit, так, програма може налаштувати можливості браузера, наприклад , чи хоче додаток запустити JS або відобразити зображення тощо ...

Я вважаю, ви повинні перевірити наявність певних властивостей, чи підтримує Flash браузер, чи браузер відображає зображення чи ні, або, можливо, ви хотіли б перевірити розмір екрану,


Ви можете обговорити це в коментарях. У будь-якому випадку є багато випадків для перевірки wevbview
Йозі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.