我知道类似的问题经常被问到,但很多都已经过时,而且事情发生了很大变化,因此我再次询问社区(2017年10月)我们如何检测用户是否正在使用iOS设备,我突出iOS,我不关心任何其他平台.
我需要检测的原因
>我正在我的网站上显示图片,用户可以点击其中一些来下载完整的高分辨率图片.在服务器端我使用X-SENDFILE将文件推送给用户,除了缺少下载功能的iOS之外的所有内容都很好用,因此在iOS情况下我需要修改标题并将图像显示为图像而不是而不是附件,因此用户可以点击它并手动将其保存到图库.
我可以使用用户代理嗅探(就像我过去一样):
$iPod = stripos($_SERVER['HTTP_USER_AGENT'],"iPod");
$iPhone = stripos($_SERVER['HTTP_USER_AGENT'],"iPhone");
$iPad = stripos($_SERVER['HTTP_USER_AGENT'],"iPad");
但是这不会为应用内浏览器(如Facebook,Twitter等)削减它,是的,你可以继续在列表中添加规则,但它将是一个持续的追赶游戏,你如何真正保持轨道更改代理字符串的所有可能的第三方应用程序.
我不想继续回去更新我的页面,这有点荒谬imho.
所以我对社区的问题是有没有更好的方法来检测iOS?
按顺序优先解决方案
>从服务器端检测
>从客户端检测(javascript)
>使用外部库(类似于https://github.com/serbanghita/Mobile-Detect,甚至可能付费,可以链接到页面而不是内置)
我不太热衷于第三种选择,因为它再次依赖于库不断更新,如果开发停止,那么我必须跟踪并忘记这样做会导致功能被破坏未来.
谢谢.
如果您对此问题进行了投票,请至少对其进行评论?
解决方法:
用于检测用户代理的当前机制就是您所提到的.相比之下,In App浏览器流量小于app / desktop流量.因此,您应该寻找的解决方案是如何识别应用程序浏览器流量.好吧,让我们分解并了解应用程序浏览器中的内容.
“In-app browsers” are not actual browsers, but a webview window running off your device’s core browser. Safari passes the “(in-app)” string into the browser name, but others don’t. As far as Google Analytics is concerned, a webview window based on Chrome is simply Chrome.
它基本上是一个Web设备核心浏览器的Web视图窗口,在iOS的情况下是Safari,在Android的情况下是Chrome.
现在要在服务器端识别这个,我们可以这样做:
//For iOS
if ((strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile/') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari/') == false) {
echo 'WebView';
} else{
echo 'Not WebView';
}
//For Android
if ($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app") {
echo 'WebView';
} else{
echo 'Not WebView';
}
我们知道标题可以伪造,所以这不是最好的解决方案.
要在客户端识别Web视图,请使用以下命令:
var userAgent = window.navigator.userAgent.toLowerCase(),
safari = /safari/.test( userAgent ),
ios = /iphone|ipod|ipad/.test( userAgent );
if( ios ) {
if ( safari ) {
//browser
} else if ( !safari ) {
//webview
};
} else {
//not iOS
};
第三个解决方案是使用我推荐的移动检测,因为它做了同样的事情并提供了一些更方便的功能.