How to detect iPad and iPad OS version in iOS 13 and Up?

◇◆丶佛笑我妖孽 提交于 2019-12-19 05:18:32

问题


I can detect iOS 13 on iPhone but in iPad OS 13 navigator.platform comes as MacIntel. So it is not possible to get iPad identified using below code, but it works perfectly on iPhone.

    if (/iP(hone|od|ad)/.test(navigator.platform)) {
            var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
            var version = [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
            return version;
    }

When we request for mobile website using the browser on iPad navigator.platform returns as iPad and works perfectly.

Can anyone suggest a way to identify iPad running on iOS 13 and up using Javascript?


回答1:


I was able to get iPad detection working by checking for navigator.maxTouchPoints as well as navigator.platform. It's not perfect (as discussed in the comments below) but it's the best solution I've come across so far so I wanted to share.

const iPad = (userAgent.match(/(iPad)/) /* iOS pre 13 */ || 
  (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) /* iPad OS 13 */);



回答2:


It's simple - you can't. You can only use hacks like this one

let isIOS = /iPad|iPhone|iPod/.test(navigator.platform)
|| (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)

The first condition for "mobile", second for iPad mimicking Macintosh Safari. It works reliably for me, but who knows what will change in the future. If there to be macs with touch screen, this will detect not only iPad in Desktop mode, but regular Macs also.

The other way is feature detection - you can, but probably shouldn't rely on browser features support. For example, Safari on Mac doesn't support date picker, but a mobile one does.

Anyway, I suggest you to not rely on platform detection (which will be broken in future anyway) and use feature detection (but not to distinct platforms) as Modernizr instead - if you want to use Date picker, you check if it is available and if it's not, use an HTML solution instead. Don't lock users just because they use some other browser. You may notify them but give an option to hide notification and use your site anyway.

As a user, I have when someone tells me to go to use other browser

Just remember - platform detection indicated a code that smells since all these are hacks.




回答3:


I did expand the implementation a little to make use of some more default browser features on iPad OS vs Mac OS Catalina. According to my tests on diverse iPads and all late iOS Devices this works well.

let isIPadOs = function() {
return window.AuthenticatorAssertionResponse === undefined
        && window.AuthenticatorAttestationResponse === undefined
        && window.AuthenticatorResponse === undefined
        && window.Credential === undefined
        && window.CredentailsContainer === undefined
        && window.DeviceMotionEvent !== undefined
        && window.DeviceOrientationEvent !== undefined
        && navigator.maxTouchPoints === 5
        && navigator.plugins.length === 0
        && navigator.platform !== "iPhone";
}

Gist: https://gist.github.com/braandl/f7965f62a5fecc379476d2c055838e36




回答4:


You can use WURFL.js, which is free if you just want to know what device is in use: https://web.wurfl.io/#wurfl-js

Full disclosure, I'm the COO of the company behind WURFL and ImageEngine, but I'm also an open-source developer :)

WURFL.js can tell you what OS is in use and if it's an iPhone or iPad.

To use it, just add this to the head of your page:

<script type="text/javascript" src="//wurfl.io/wurfl.js"></script>

Then you can use the device information in javascript:

console.log(WURFL.complete_device_name);

Note: With the paid version you can get more accurate results (ex: Apple iPhone XS Max, Apple iPad Pro 11) as well as a many other device characteristics.

If you don't need the device information for the initial paint, you can also run this asynchronously so it doesn't block rendering. Stick it at the end of the body and use async or defer:

<script type="text/javascript">
window.addEventListener('WurflJSDetectionComplete', () => {
   console.log(`Device: ${WURFL.complete_device_name}`);
});
</script>
<script type="text/javascript" src="//wurfl.io/wurfl.js" async></script>

While you're at it, you might as well use this improved device information to enhance Google Analytics: https://www.scientiamobile.com/wurfljs-google-analytics-iphone/

Note that unlike the other answers, this one requires no ongoing maintenance on the part of the developer.




回答5:


It's a bit hackish and surely not very future safe but for now we are using the following and it seems to do the trick.

The first block is just sniffing the user agent for older iPads and the the second block after 'OR' is checking if the platform is Macintosh and has touch points. At the time of writing this, there's no official touch screen for Mac yet, so it should be pretty safe for a while.

if ((/\b(iPad)\b/.test(navigator.userAgent)
    && /WebKit/.test(navigator.userAgent)
    && !window.MSStream)
    || (navigator.platform === 'MacIntel'
    && navigator.maxTouchPoints
    && navigator.maxTouchPoints === 5)
  ) {
        return true;
    }


来源:https://stackoverflow.com/questions/57765958/how-to-detect-ipad-and-ipad-os-version-in-ios-13-and-up

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!