通过javascript检测ipad / iphone的webview

如果网站运行在iPad的Safari浏览器或WebView内的应用程序,有没有一种方法通过JavaScript不同?

这使用了window.navigator.userAgentwindow.navigator.standalone的组合。 它可以区分与iOS Web应用程序有关的所有四个状态: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 

在iPad上运行Safari

 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 

在Mac OS X上的Safari中运行

 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 

在Mac OS X上的Chrome中运行

 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 

在Mac OS X上运行在FireFox上

 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


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的不同之处在于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); 

我尝试所有这些解决scheme,但在我的情况下,
我想在Webview中检测电报 。 Safari改变手机风格的文本链接与“tel:”perfix,所以我使用它,并写下这段代码,你可以testing它: 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的解决scheme不再工作(见评论),可以简化。 另一方面,在UAtesting只有“Safari”比ios手持设备更受欢迎。

这是我正在使用的testing:

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

会build议使用Modernizr ,并像这样检查indexeddb。 您可以与用户代理configuration(设备,操作系统,浏览器等)进行交叉检查,但是纯粹的function检测似乎更受推荐。

我知道这段代码将检查它是否被添加到主屏幕的图标访问:

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

但我不知道它将如何在UIWebView中作出反应。 我可以想到的唯一的其他解决scheme是获取用户代理或使用- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType并replace正在访问的页面的查询string用页面用来识别它是从Web视图访问的东西。

上次我需要这个(只是为了WebView的目的),我用这个检查:

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

我发现了一个简单的解决scheme来检测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 } 

我不认为在客户端Javascript中可以使用任何具体的东西,但是如果您能够控制UIWebView能够发挥的function,那么您可能需要考虑使用它生成的用户代理string进行操作,并在您的客户端JavaScript代替? 有点黑客我知道,但嘿…这个问题可能会给一些关于调整用户代理的指针:

更改UIWebView中的用户代理(iPhone SDK)

@ Sod,那么我没有答案,但我不相信你为什么要检查,因为,浏览器引擎是否它的safari(浏览器)或应用程序将只是相同的Webkit,是应用程序可以configuration浏览器引擎function,应用程序是否想运行JS或显示图像等…

我相信,你必须检查浏览器是否支持Flash,或者浏览器是否显示图像,或者你可能想检查屏幕大小,