检测 iPhone 浏览器

12

是否有一种脚本可以检测访问者是否使用iPhone(无论是使用哪种浏览器,如iPhone Safari、iPhone for Opera等)?

然后将关闭我部分的JavaScript。

谢谢...

6个回答

30

在网上搜索,有两种常见的实现方法。

但我最喜欢的是在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 - GusDeCooL
我知道你的意思。我喜欢PHP。当用户右键查看源代码时,无法看到用于编写网站的任何代码。它非常灵活,而且易于使用。所有代码都在服务器上处理,这是一个优点。希望这可以帮助你。如果需要更多帮助...请告诉我。如果需要进行任何调整,可以进行调整。 - Pavan
是的,我会在测试iPhone环境后将其标记为正确答案:D,现在我仍在下载虚拟软件来测试它:)...非常感谢:D - GusDeCooL
在 JS 版本中,实际上应该是 agent.indexOf('iPod'),不应该是原来的代码。 - mpdonadio
糟糕,感谢您发现错误。已进行更改。 - Pavan
显示剩余3条评论

7
传统观念认为,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将变为true。这可能会导致一些奇怪的行为!

在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 Media Queries),那么请尽量避免。


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
}

2
<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,然后执行一个操作。试试看吧。


好的,请告诉我它对你来说进展如何。我已经使用了几次,似乎运行良好。下一步是添加其他字符串,然后根据您想要的功能为每个字符串添加操作。 - d2burke

1

虽然我喜欢这里的答案,但我认为最好使用以下方法...

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的空间 :) 希望能帮到您。

0
虽然回答这个问题有些晚了,但我认为这个答案还是很有用的。
与其重定向移动用户,不如考虑使用响应式CSS设计来为桌面和移动用户提供相同内容但不同风格的页面。这有助于避免代码分裂和重复。你可以从头开始编写响应式CSS,也可以使用预先打包好的框架,比如Twitter Bootstrap。

1
我认为响应式CSS并不适合同时设计桌面和移动端,因为我们想要在桌面和移动端展示的信息是不同的。例如,在移动端我们不需要展示太多信息,否则会让设计看起来复杂。我认为响应式设计的目的是使网站在不同的显示屏上看起来好看。 - GusDeCooL
OP并不是为了重定向而提问,而是为了避免运行脚本。 - Matt Parkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接