I have a simple PHP webpage, and would like to return different content depending if it's accessed from an iPhone/iPad or from a web brower. How can I do that?
10 Answers
Use the user agent from $_SERVER['HTTP_USER_AGENT']
,
and for simple detection you can use this script:
<?php
//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
}
?>
If you want to know more details of the user device I recommended to use one of the following solutions: http://51degrees.mobi or http://deviceatlas.com
-
5But it was not really true, I found out. Those headers are just from Safari in the phone. If you connect from an app, it looks something like this: app%20name/1.0 CFNetwork/485.13.8 Darwin/11.0.0 . So maybe I can look for CFNetwork or Darwin instead, or the app name. – Snilleblixten Jun 12 '11 at 18:13
-
2Not working for me I am getting 1.1 CFNetwork/548.0.3 Darwin/11.0.0 for both iPhone and iPad :S now how should I differentiate between them ??? – Asad Khan Apr 18 '12 at 12:06
-
1@AsadKhan wore u testing from the simulator ? I am getting same Http_user_agent – Kishor Kundan Oct 02 '12 at 09:54
-
@Snilleblixten did it work out ? m stuck with similar situation. – Kishor Kundan Oct 02 '12 at 09:58
-
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.130 Chrome/43.0.2357.130 Safari/537.36 ==> tat was my user agent for chromium browser Version 43.0.2357.130 Ubuntu 14.04 (64-bit). - $webOS will not set to value >= 0 – gkd Aug 13 '15 at 09:14
-
From iOS 13 the iPad's user agent has changed to Mac OS, for example: `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15`... – zvi Jul 07 '19 at 14:39
-
1update for new: $iPadOS = stripos($_SERVER['HTTP_USER_AGENT'],"Macintosh"); – Fadi Oct 28 '19 at 04:07
-
1Working perfect. Tested on 2 iphones, Ipad. Thanks its 2020!! – Rodrigo Zuluaga Jul 09 '20 at 00:42
-
Will detecting "Macintosh" only be for new iPads or will that include Mac laptops & desktops? – drooh Jan 20 '21 at 17:28
-
1Why check `$_SERVER['HTTP_USER_AGENT'` five times when you should store it in a variable? Sloppy – Dexygen Feb 25 '23 at 15:35
preg_match("/iPhone|Android|iPad|iPod|webOS/", $_SERVER['HTTP_USER_AGENT'], $matches);
$os = current($matches);
switch($os){
case 'iPhone': /*do something...*/ break;
case 'Android': /*do something...*/ break;
case 'iPad': /*do something...*/ break;
case 'iPod': /*do something...*/ break;
case 'webOS': /*do something...*/ break;
}

- 616
- 6
- 7
function user_agent(){
$iPod = strpos($_SERVER['HTTP_USER_AGENT'],"iPod");
$iPhone = strpos($_SERVER['HTTP_USER_AGENT'],"iPhone");
$iPad = strpos($_SERVER['HTTP_USER_AGENT'],"iPad");
$android = strpos($_SERVER['HTTP_USER_AGENT'],"Android");
file_put_contents('./public/upload/install_log/agent',$_SERVER['HTTP_USER_AGENT']);
if($iPad||$iPhone||$iPod){
return 'ios';
}else if($android){
return 'android';
}else{
return 'pc';
}
}

- 1,913
- 21
- 17
function isIosDevice(){
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
$iosDevice = array('iphone', 'ipod', 'ipad');
$isIos = false;
foreach ($iosDevice as $val) {
if(stripos($userAgent, $val) !== false){
$isIos = true;
break;
}
}
return $isIos;
}

- 1,970
- 3
- 11
- 15
-
1You should add a `!empty($_SERVER['HTTP_USER_AGENT'])` since `$_SERVER['HTTP_USER_AGENT']` is not set when the client sends no user agent at all. Your function will crash then/show a notice. – Thomas Kekeisen Sep 15 '16 at 16:42
If you just want to detect mobile devices in generel, Cake has build in support using RequestHandler->isMobile() (http://book.cakephp.org/2.0/en/core-libraries/components/request-handling.html#RequestHandlerComponent::isMobile)

- 13
- 5
It's work for Iphone
<?php
$browser = strpos($_SERVER['HTTP_USER_AGENT'],"iPhone");
if ($browser == true){
$browser = 'iphone';
}
?>

- 21
- 1
- 7
<?php
$iPhone = false;
$AndroidPhone = false;
$deviceType = 0;
$ua = strtolower($_SERVER['HTTP_USER_AGENT']);
print "<br>".$ua;
if(strpos($ua,"iphone") !== false ){
$iPhone = true;
}
if(strpos($ua,"android") !== false){
if(strpos($_SERVER['HTTP_USER_AGENT'],"mobile")){
$AndroidPhone = true;
}
}
if(stripos($_SERVER['HTTP_USER_AGENT'],"iPad")){
$iPad = true;
$Tablet = true;
$iOS = true;
}
if($AndroidPhone==true || $iPhone==true)
{
$deviceType = 1;
}
?>

- 407
- 2
- 4
- 11
51Degrees' PHP solution is able to do this. you can get the free Open Source API here https://github.com/51Degrees/Device-Detection. You can use the HardwareFamily Property to determine if it is an iPad/iPod/iPhone etc.
Due to the nature of Apple's User-Agents the initial result will return a generic device, however if you are interested in the specific device you can use a JavaScript client side override to determine to specific model.
To do this you can implement something similar to the following logic once you have determined it is an Apple Device, in this case for an iPhone.
// iPhone model checks.
function getiPhoneModel() {
// iPhone 6 Plus
if ((window.screen.height / window.screen.width == 736 / 414) &&
(window.devicePixelRatio == 3)) {
return "iPhone 6 Plus";
}
// iPhone 6
else if ((window.screen.height / window.screen.width == 667 / 375) &&
(window.devicePixelRatio == 2)) {
return "iPhone 6";
}
// iPhone 5/5C/5S or 6 in zoom mode
else if ((window.screen.height / window.screen.width == 1.775) &&
(window.devicePixelRatio == 2)) {
return "iPhone 5, 5C, 5S or 6 (display zoom)";
}
// iPhone 4/4S
else if ((window.screen.height / window.screen.width == 1.5) &&
(window.devicePixelRatio == 2)) {
return "iPhone 4 or 4S";
}
// iPhone 1/3G/3GS
else if ((window.screen.height / window.screen.width == 1.5) &&
(window.devicePixelRatio == 1)) {
return "iPhone 1, 3G or 3GS";
} else {
return "Not an iPhone";
};
}
Or for an iPad
function getiPadVersion() {
var pixelRatio = getPixelRatio();
var return_string = "Not an iPad";
if (pixelRatio == 1 ) {
return_string = "iPad 1, iPad 2, iPad Mini 1";
}
if (pixelRatio == 2) {
return_string = "iPad 3, iPad 4, iPad Air 1, iPad Air 2, iPad Mini 2, iPad
Mini 3";
}
return return_string;
}
For more information on research 51Degrees have done into Apple devices you can read their blog post here https://51degrees.com/blog/device-detection-for-apple-iphone-and-ipad.
Disclosure: I work for 51Degrees.

- 69
- 1
- 9
In response to Haim Evgi's code, I added !== false to the end for it to work for me
$iPod = stripos($_SERVER['HTTP_USER_AGENT'],"iPod") !== false;
$iPhone = stripos($_SERVER['HTTP_USER_AGENT'],"iPhone") !== false;
$iPad = stripos($_SERVER['HTTP_USER_AGENT'],"iPad") !== false;
$Android = stripos($_SERVER['HTTP_USER_AGENT'],"Android") !== false;

- 23
- 3
-
Best to add this as a comment on his answer, even though I know it's some time since you commented. Thanks for the code! – Brian C Jun 24 '18 at 10:27
-
1@BrianC Sigh, Stack Overflow says I must have 50 reputation to comment. – Gloson Jul 30 '18 at 13:29