Czy istnieje sposób, aby odróżnić się za pomocą javascript, jeśli witryna działa w iPadzie safari lub w aplikacji WebView?
javascript
ipad
ios
webview
darń
źródło
źródło
Odpowiedzi:
To używa kombinacji
window.navigator.userAgent
iwindow.navigator.standalone
. Rozróżnia wszystkie cztery stany związane z aplikacją internetową na iOS: safari (przeglądarka), samodzielna (pełny ekran), uiwebview, a nie iOS.Demo: 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 };
źródło
Safari
w userAgent. zachowuje się inaczej w odniesieniu do wymaganiawebcal://
protokołu dla plików .icsAgenty użytkownika
Działa w UIWebView
Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/98176
Działa w Safari na iPadzie
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
Działa w Safari na 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
Działa w Chrome na 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
Działa w FireFox na Mac OS X
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0
Kod wykrywania
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);
źródło
UIWebView
i Safari mająSafari
w swoim kliencie użytkownikaVersion
a nieSafari
działało dla mnie w najnowszym iOS.Version
? Czy zastąpićSafari
zeVersion
wvar is_uiwebview
wierszu?Myślę, że możesz po prostu użyć
User-Agent
.AKTUALIZACJA
Strona przeglądana za pomocą 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
Spróbuję za chwilę z 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
Różnica polega na tym, że mówi Safari
Safari/6531.22.7
Rozwiązanie
var isSafari = navigator.userAgent.match(/Safari/i) != null;
źródło
Safari/.....
samego siebie brakuje w UIWebViewTak:
// 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);
źródło
Wypróbowałem wszystkie te rozwiązania, ale nie zadziałały w moim przypadku,
zamierzałem wykryć Telegram w Webview. Zauważyłem, że Safari zmienia tekst w stylu telefonu na link z prefiksem „tel:”, więc użyłem tego do napisania tego kodu, możesz go przetestować: 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>
źródło
navigator.platform === 'MacIntel'
. Dotyczy to szczególnie iPadOS 13 Mobile Safari, ponieważ domyślnie używa trybu pulpitu.Rozwiązanie Neoneye już nie działa (patrz komentarze) i można je uprościć. Z drugiej strony, testowanie tylko „Safari” w UA oznacza znacznie więcej niż urządzenia przenośne z iOS.
Oto test, którego używam:
var is_ios = /(iPhone|iPod|iPad).*AppleWebKit.*Safari/i.test(navigator.userAgent);
źródło
Na wiosnę 2018 roku żadna z proponowanych metod nie zadziałała, więc wymyśliłem nowe podejście (które nie jest oparte na 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
Możesz również rozszerzyć kod na urządzenia iPad, myślę, że powinno to załatwić sprawę.
Działał dobrze w przypadku widoków internetowych Telegram, Facebook, VK.
źródło
Working 15.02.19
Innym rozwiązaniem służącym do wykrywania wyświetleń stron internetowych w systemie iOS jest sprawdzanie obsługi / istnienia
navigator.mediaDevices
.if (navigator.mediaDevices) { alert('has mediaDevices'); } else { alert('has no mediaDevices'); }
W moim przypadku nie musiałem przechwytywać wszystkich odsłon internetowych, ale te, które nie obsługują wejścia kamery / mikrofonu (Przypomnienie: Alerty nie uruchamiają się w Webview, więc pamiętaj, aby zmienić coś w dom do celów debugowania)
źródło
Wiem, że ten kod sprawdzi, czy jest dostępny z ikony dodanej do ekranu głównego:
if (window.navigator.standalone == true) { //not in safari }
ale nie jestem pewien, jak by zareagował w UIWebView. Jedyne inne rozwiązanie, o którym mógłbym pomyśleć, to pobranie agenta użytkownika lub użycie
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
i zastąpienie ciągu zapytania strony, do której uzyskujesz dostęp, czymś, czego strona używa do zidentyfikowania, że uzyskuje się do niej dostęp z widoku sieci Web.źródło
Sugerowałbym użycie Modernizr i sprawdzenie indexeddb w ten sposób . Możesz to sprawdzić w konfiguracji agenta użytkownika (urządzenie, system operacyjny, przeglądarka itp.), Ale bardziej zalecane jest wykrywanie samych funkcji.
źródło
Ostatnim razem, gdy tego potrzebowałem (TYLKO do celów WebView), użyłem tego sprawdzenia:
function isIOS() { return !/safari/.test( window.navigator.userAgent.toLowerCase()) || navigator.platform === 'iOS' || navigator.platform === 'iPhone'; }
źródło
Znalazłem proste rozwiązanie do wykrywania iPhone'a lub iPada. U mnie to działa dobrze.
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 }
źródło
Wypróbuj z 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)
źródło
Nie sądzę, aby było coś konkretnego, czego można by użyć w JavaScript po stronie klienta, ale jeśli masz kontrolę nad tym, co może zrobić początkowy UIWebView, możesz rozważyć zabawę z ciągiem agenta użytkownika, który generuje, i przetestowanie tego w swoim Zamiast tego JavaScript po stronie klienta? Trochę hack, wiem, ale hej… To pytanie może dać kilka wskazówek na temat ulepszania agenta użytkownika:
Zmień klienta użytkownika w UIWebView (iPhone SDK)
źródło
@ Cholera, cóż, nie mam odpowiedzi, ale nie jestem przekonany, dlaczego chcesz sprawdzić, ponieważ silnik przeglądarki, czy jego safari (przeglądarka) lub aplikacja będzie taka sama, tylko Webkit, tak Aplikacja może skonfigurować funkcje silnika przeglądarki, takie jak , czy aplikacja chce uruchamiać JS lub Display Image itp…
Uważam, że musisz sprawdzić pod kątem określonej właściwości, czy Flash jest obsługiwany przez przeglądarkę lub czy przeglądarka wyświetla obraz, czy nie, a może chcesz sprawdzić rozmiar ekranu,
źródło