检测 iPhone 浏览器
Posted
技术标签:
【中文标题】检测 iPhone 浏览器【英文标题】:Detect iPhone Browser 【发布时间】:2011-04-19 03:41:24 【问题描述】:是否有脚本可以检测访问者是否使用 iphone(无论是什么浏览器,可能是 iphone Safari、iPhone for Opera 等)?
然后将关闭我的一些 javascript。
谢谢...
【问题讨论】:
【参考方案1】:在网上搜索有两种常见的方法来实现这一点。 我最喜欢的是 php,它就这么干净吗?哇。 :D
你可以用 PHP 编写
<?php
function isIphone($user_agent=NULL)
if(!isset($user_agent))
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
return (strpos($user_agent, 'iPhone') !== FALSE);
if(isIphone())
header('Location: http://www.yourwebsite.com/phone');
exit();
// ...THE REST OF YOUR CODE HERE
?>
你可以用javascript写
var agent = navigator.userAgent;
var isIphone = ((agent.indexOf('iPhone') != -1) || (agent.indexOf('iPod') != -1)) ;
if (isIphone)
window.location.href = 'http://www.yourwebsite.com/phone';
希望对您有所帮助。
PK
【讨论】:
太好了...非常感谢您提供 PHP 脚本中的代码。似乎这是最好的解决方案,因为我想为不同的浏览器执行不同的任务,我希望它从服务器处理:D 我完全明白你的意思。我爱php。当用户右键单击源时,您看不到任何用于对站点进行编程的代码。它也非常灵活。并且它易于使用。所有代码都在服务器上处理,这是一个奖励。希望这可以帮助。如果您需要更多帮助...请告诉我。如果需要,可以调整此代码。 事实上你可以增强这个代码来检查它是否是一个 ipod。如果您需要帮助,请告诉我。另外,当您在这里时,将此帖子标记为已回答谢谢。所以人们知道这是正确的答案,然后他们可以在您尝试过时将其用作参考。谢谢 是的,我会在 iPhone 环境中测试时将其标记为正确答案 :D,现在我仍然下载虚拟软件进行测试:)... 非常感谢 :D 您好,我已经用我的测试仪测试了它,它工作正常,现在我也需要 Ipad。你能帮我写代码吗?【参考方案2】:传统观点认为 ios 设备有一个用于 Safari 的用户代理和一个用于 UIWebView 的用户代理。这个假设是不正确的,因为 iOS 应用程序可以并且确实可以自定义它们的用户代理。这里的主要罪犯是 Facebook。
比较来自 iOS 设备的这些用户代理字符串:
# iOS 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
iPhone: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
# UIWebView
iPad: Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/98176
iPhone: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Mobile/8B117
# Facebook UIWebView
iPad: Mozilla/5.0 (iPad; U; CPU iPhone OS 5_1_1 like Mac OS X; en_US) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.1.1;FBBV/4110.0;FBDV/iPad2,1;FBMD/iPad;FBSN/iPhone OS;FBSV/5.1.1;FBSS/1; FBCR/;FBID/tablet;FBLC/en_US;FBSF/1.0]
iPhone: Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; ru_RU) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.1;FBBV/4100.0;FBDV/iPhone3,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; tablet;FBLC/en_US]
请注意,在 iPad 上,Facebook UIWebView 的用户代理字符串包括“iPhone”。
在 JavaScript 中识别 iPhone 的旧方法:
IS_IPHONE = navigator.userAgent.match(/iPhone/i) != null) || (navigator.userAgent.match(/iPod/i) != null);
如果您使用这种方法来检测 iPhone,如果用户来自 iPad 上的 Facebook,您最终会得到 IS_IPHONE 为真。这可能会产生一些奇怪的行为!
在 JavaScript 中识别 iPhone 的正确方法:
IS_IPAD = navigator.userAgent.match(/iPad/i) != null;
IS_IPHONE = (navigator.userAgent.match(/iPhone/i) != null) || (navigator.userAgent.match(/iPod/i) != null);
if (IS_IPAD)
IS_IPHONE = false;
我们在 iPad 上声明 IS_IPHONE 为 false,以涵盖奇怪的 Facebook UIWebView iPad 用户代理。这是用户代理嗅探不可靠的一个示例。自定义用户代理的 iOS 应用程序越多,用户代理嗅探的问题就越多。如果您可以避免用户代理嗅探(提示:CSS 媒体查询),那就去做吧。
【讨论】:
【参考方案3】://Detect special conditions devices
$iPod = stripos($_SERVER['HTTP_USER_AGENT'],"iPod");
$iPhone = stripos($_SERVER['HTTP_USER_AGENT'],"iPhone");
$iPad = stripos($_SERVER['HTTP_USER_AGENT'],"iPad");
$android = stripos($_SERVER['HTTP_USER_AGENT'],"Android");
$webOS = stripos($_SERVER['HTTP_USER_AGENT'],"webOS");
//do something with this information
if( $iPod || $iPhone )
//browser reported as an iPhone/iPod touch -- do something here
else if($iPad)
//browser reported as an iPad -- do something here
else if($Android)
//browser reported as an Android device -- do something here
else if($webOS)
//browser reported as a webOS device -- do something here
【讨论】:
【参考方案4】:<script language="javascript" type="text/javascript">
//This redirects iPhone users to the iPhone-friendly site
if ((navigator.userAgent.indexOf('iPhone') != -1) ||
(navigator.userAgent.indexOf('iPod') != -1))
document.location = "http://i.yoursite.com";
此脚本在 userAgent 中检查 iPhone 或 iPod,然后执行操作。试试这个。
【讨论】:
好的,让我知道你的情况如何。我已经用过好几次了,似乎找到了。下一步是添加其他字符串,然后根据您想要的功能为每个字符串添加操作。【参考方案5】:虽然我喜欢这里的答案,但我认为最好使用以下...
http://www.htaccesstools.com/articles/detect-and-redirect-iphone/
RewriteEngine on
RewriteCond %HTTP_USER_AGENT iPhone
RewriteRule .* http://iphone.example.com/ [R]
或
RewriteEngine on
RewriteCond %HTTP_USER_AGENT iPhone
RewriteCond %REQUEST_URI !^/my-iPhone-site/
RewriteRule .* /my-iPhone-site/ [R]
这是一个 .htaccess 替代方案,这意味着您有更多的空间来处理 php :) 希望对您有所帮助
【讨论】:
【参考方案6】:对这个问题的间接间接回答,但我发现它很有用。
考虑使用响应式 CSS 设计为桌面和移动用户提供具有两种不同样式的相同内容,而不是重定向移动用户。这有助于避免拆分和重复代码。您可以从头开始编写响应式 CSS,或使用预打包的框架,如 Twitter Bootstrap。
【讨论】:
我不认为响应式 css 对设计 dekstop 和 mobile 有好处,因为我们想要在 dekstop 和 mobile 中显示的信息会有所不同。例如,我们没有在移动设备中提供太多信息,这使得设计看起来很复杂。我认为响应式设计旨在使网站在不同的显示屏上看起来像商品。 OP 没有询问,因为是为了重定向,而是为了避免运行脚本。以上是关于检测 iPhone 浏览器的主要内容,如果未能解决你的问题,请参考以下文章
检测 iOS 浏览器 (Iphone,Ipod,Ipad) 将 DIV 从 FLASH 更改为 HTML5