13 ответов:
Это использует комбинацию
window.navigator.userAgentиwindow.navigator.standalone. Он может различать все четыре состояния, относящиеся к веб-приложению iOS: safari (браузер), standalone (полноэкранный режим), 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 };
Агенты Пользователей
работает в 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);
Я думаю, что вы можете просто использовать
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/6531.22.7
решение
var isSafari = navigator.userAgent.match(/Safari/i) != null;
да:
// 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);
Я пробовал все эти решения, но не работают в моем случае,
Я собирался обнаружить телеграмма внутри 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>
решение Neoneye больше не работает (см. комментарии) и может быть упрощено. С другой стороны, тестирование только "Safari" в UA адресует гораздо больше, чем карманные устройства ios.
Это тест, который я использую :
var is_ios = /(iPhone|iPod|iPad).*AppleWebKit.*Safari/i.test(navigator.userAgent);
Я знаю, что этот код будет проверять, если он доступен из значка, добавленного на главный экран:
if (window.navigator.standalone == true) { //not in safari }но я не уверен, как он будет реагировать в UIWebView. Единственное другое решение, которое я мог бы придумать, - это получить пользовательский агент или использовать
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationTypeи замена строки запроса страницы, к которой вы обращаетесь, чем-то, что страница использует, чтобы определить, что к ней обращаются из веб-представления.
в прошлый раз, когда мне это было нужно (только для целей WebView), я использовал эту проверку:
function isIOS() { return !/safari/.test( window.navigator.userAgent.toLowerCase()) || navigator.platform === 'iOS' || navigator.platform === 'iPhone'; }
Я нашел простое решение для обнаружения 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 }
обратите внимание, что этот подход не работает для iOS 10 и более старых версий.
весной 2018 года ни один из предложенных методов не работал для меня, поэтому я придумал новый подход (который не основан на userAgent):
const hasValidDocumentElementRatio = [ 320 / 454 // 5, SE , 375 / 553 // 6, 7, 8 , 414 / 622 // 6, 7, 8 Plus , 375 / 635 // X ].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 webviewshttps://gist.github.com/BorisChumichev/7c0ea033daf33da73306a396ffa174d1
вы можете расширить код для iPad устройств тоже, я думаю, что это должно сделать трюк.
хорошо работал Telegram, Facebook, VK webviews.
Я не думаю, что есть что-то конкретное, что вы можете использовать в клиентском Javascript, но если у вас есть контроль над тем, что может сделать исходный UIWebView, вы можете рассмотреть возможность игры со строкой агента пользователя, которую он генерирует, и тестирования для этого в вашем клиентском Javascript вместо этого? Немного Хака я знаю, но Эй... этот вопрос может дать некоторые указания на настройку агента пользователя:
@ Sod, Ну у меня нет ответа, но я не уверен, почему вы хотите проверить, так как, браузерный движок ли его safari (браузер ) или приложение будет таким же его Webkit только, Да приложение может настроить возможности движка браузера, например, хочет ли приложение запускать JS или отображать изображение и т. д...
Я считаю, что вы должны проверить определенное свойство, поддерживается ли Flash браузером или браузер отображает изображение или нет, или, возможно, вы хотели бы проверьте размер экрана,
Comments