通过javascript检测ipad / iphone的webview
如果网站运行在iPad的Safari浏览器或WebView内的应用程序,有没有一种方法通过JavaScript不同?
这使用了window.navigator.userAgent
和window.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,或者浏览器是否显示图像,或者你可能想检查屏幕大小,