Detecting iOS / Android Operating system
Solution 1
You can test the user agent string:
/**
* Determine the mobile operating system.
* This function returns one of 'iOS', 'Android', 'Windows Phone', or 'unknown'.
*
* @returns {String}
*/
function getMobileOperatingSystem() {
var userAgent = navigator.userAgent || navigator.vendor || window.opera;
// Windows Phone must come first because its UA also contains "Android"
if (/windows phone/i.test(userAgent)) {
return "Windows Phone";
}
if (/android/i.test(userAgent)) {
return "Android";
}
// iOS detection from: http://stackoverflow.com/a/9039885/177710
if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {
return "iOS";
}
return "unknown";
}
Solution 2
Solution 1: User Agent Sniffing
For Android and iPhone:
if( /Android|webOS|iPhone|iPad|iPod|Opera Mini/i.test(navigator.userAgent) ) {
// run your code here
}
If you wanna detect all mobile devices including blackberry and Windows phone then you can use this comprehensive version:
var deviceIsMobile = false; //At the beginning we set this flag as false. If we can detect the device is a mobile device in the next line, then we set it as true.
if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)
|| /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) {
deviceIsMobile = true;
}
if(deviceIsMobile){
// run your code here
}
Cons: User agent strings are changing and getting updated as new phones and brands are coming day by day. So you need to keep this list updated if you wanna support all mobile devices.
Solution 2: mobile detect JS library
You can use the mobile detect JS library to do this.
Cons: These JavaScript-based device detection features may ONLY work for the newest generation of smartphones, such as the iPhone, Android and Palm WebOS devices. These device detection features may NOT work for older smartphones which had poor support for JavaScript, including older BlackBerry, PalmOS, and Windows Mobile devices.
Solution 3
One can use navigator.platform to get the operating system on which browser is installed.
function getPlatform() {
var platform = ["Win32", "Android", "iOS"];
for (var i = 0; i < platform.length; i++) {
if (navigator.platform.indexOf(platform[i]) >- 1) {
return platform[i];
}
}
}
getPlatform();
Solution 4
This issue has already been resolved here : What is the best way to detect a mobile device in jQuery?.
On the accepted answer, they basically test if it's an iPhone, an iPod, an Android device or whatever to return true. Just keep the ones you want for instance if( /Android/i.test(navigator.userAgent) ) { // some code.. }
will return true only for Android user-agents.
However, user-agents are not really reliable since they can be changed. The best thing is still to develop something universal for all mobile platforms.
Solution 5
If you're using React Js for your website, use https://www.npmjs.com/package/react-device-detect
Related videos on Youtube
![Alexander Lozada](https://i.stack.imgur.com/r7d2C.jpg?s=256&g=1)
Alexander Lozada
I try to help out when I can! UI/UX designer and Full stack web dev CSS Expert Professional cat.
Updated on February 20, 2022Comments
-
Alexander Lozada over 2 years
I've done some research, and this question has come up, but not in the way I intend. I'm building a page for a client that is a QR code landing, which is a place to download an application. So he doesn't have to print out 2 QR codes on a page, I'd like to detect the current operating system (Apple/Android/Other[not supported]) and modify my elements based on that value.
I've looked at the script "detectmobilebrowsers" and that is just aimed at telling whether or not the user is mobile at all, whereas I would like to figure out what operating system the user is running and suggest the best application version.
Other answers I found similar to this question seemed either outdated or unreliable (has no detection for Android tablet browsers), so I'm in search of something new. How can I achieve this? (Preferably using jQuery - Javascript - PHP in that order).
-
Babak Naffas over 10 yearsThe user agent doesn't tell you what you need to know?
-
gretro over 10 yearsThis issue has already been resolved here : stackoverflow.com/questions/3514784/…
-
Alexander Lozada over 10 years@gretro, that describes if the user is mobile, not the operating system they are running. Babak, would something like navigator.platform be the solution? I'm unfamiliar with user agents. How can I make sure that it will work for ALL android devices regardless of version?
-
Reinstate Monica Cellio over 10 yearsThere's no guaranteed way to detect it, since the user agent is the only thing you can go on. Check here for more info... whatsmyos.com
-
gretro over 10 years@Alexander Lozada : On the accepted answer, they basically test if it's an iPhone, an iPod, an Android device or whatever to return true. Just keep the ones you want for instance
if( /Android/i.test(navigator.userAgent) ) { // some code.. }
will return true only for Android user-agents. -
Alexander Lozada over 10 years@gretro, thanks. I believe this is enough of a different situation to have a separate answer, especially to folks like me who aren't very good at understanding regexes/light on javascript knowledge. If you'd like to make your comment an answer I'd accept it as the answer. Anyway, from reading it doesn't sound like userAgents are the most reliable things - but I guess this is the best course of action, right?
-
Ruan Mendes over 10 years@AlexanderLozada Here's a list of user agents for you to make sure you cover all your target mobile browsers
-
kiranpradeep about 9 yearspossible duplicate of Detect if browser is running on an Android or iOS device
-
-
Ruan Mendes over 10 yearsAnd the OP can look at this list in case your test needs tweaking
-
DaFunkyAlex almost 9 yearsAwesome. Using Chrome's mobile mode u can test it on desktop browsers.
-
mico over 8 yearsOn a Samsung Galaxy Grand Prime I am testing now, navigator.platform returns ''Linux armv7l''
-
torno over 8 yearsMicrosoft has unfortunately added
Android
to their Edge browser's userAgent string so this test won't work for many Windows Phones: msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx -
feeela over 8 years@torno That is why one should not rely on Client detection, but on feature detection.
-
Daniel Lubarov over 8 years@feeela sometimes the feature is something like being able to install apks, which isn't possible to detect.
-
Arthur about 8 yearsI've added
else if (userAgent.match(/Windows Phone/i)) { return 'WindowsPhone'; }
before the Android else if to detect Windows Phone. So far seems to be working fine. -
Oliver almost 8 yearsFrom stackoverflow.com/a/9039885/177710: in the check for
iOS
we need to also verify!window.MSStream
to avoid IE11 being counted asiOS
;-) -
Alex Jone over 6 yearsIf it's in jQuery than it's different from vanilla JS. It might as well be in C.
-
jessepinho over 5 yearsNote that this is a bit of a heavy import (~23kb) for just checking iOS vs. Android.
-
Kira about 5 years@jessepinho: true. In hindsight I wouldn't do so to keep my build light. But it did help to get things working.
-
Ivan Ferrer about 4 yearsNot working iPAD Pro: return this:
Safari: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
-
Fredrik almost 3 yearsYou should not depend on
navigator.platform
since it is deprecated. See: developer.mozilla.org/en-US/docs/Web/API/Navigator/platform -
Saravanan Nandhan about 2 yearsfor me it shows error like : Property 'opera' does not exist on type 'Window & typeof globalThis'.ts(2339)