咱们通常在浏览器里识别用户的访问设备都是经过 User Agent
这个字段来获取的,可是经过它咱们只能获取一个大概的信息,好比你用的是 Mac 仍是 Windows,用的是 iPhone 仍是 iPad。若是我想知道你用的是第几代 iPhone,这个方法就不行了,前段时间我正好有这个需求,识别移动客户端的具体型号(主要是 iOS 设备),因而思考了下这个问题的实现。javascript
首先,我跟你们同样想到了 UA,不过事实证实这路走不通。就在我无聊一个一个摆弄浏览器的 API 时,忽然一篇文章里的某段代码提醒了了我。这篇文章讲的是怎样经过 js 获取图形设备信息的,由于 HTML5 支持了 canvas,因此能够经过 API 获取图形设备的型号,好比显卡的型号。html
(function () { var canvas = document.createElement('canvas'), gl = canvas.getContext('experimental-webgl'), debugInfo = gl.getExtension('WEBGL_debug_renderer_info'); console.log(gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)); })();
运行这段代码就能够获取显卡的型号了,若是你在iOS的设备里运行,会获取到诸如 Apple A9 GPU
之类的信息。而咱们知道每一代 iOS 设备的 GPU 型号都是不一样的,好比 iPhone 6 是 A8,而 iPhone 6s 就是 A9。看到这里,你应该大概知道个人思路了,就是经过识别 GPU 的型号来辨别设备的型号。java
不过这还有个小瑕疵,有些设备是同一代,也就是 GPU 型号彻底相同,好比 iPhone 6s, iPhone 6s Plus, iPhone SE。它们用的都是 Apple A9 GPU
,怎么区分开它们呢?你会发现它们最大的不一样不就是分辨率不一样吗?而经过 JavaScript 咱们又能够方便地获取屏幕分辨率,这样把两个手段综合应用一下就能够获取设备的准确型号了。git
这里有个示例网址,你们能够用手机访问
https://joyqi.github.io/mobil...github
个人代码都放在了 GitHub 上
https://github.com/joyqi/mobi...web
此次思考给了我一些解决问题的启发,咱们在思考解决方案的时候从侧面入手说不定会有新的发现。就好比咱们的这个代码,目前还没法识别同一代的 iPad Air 和 iPad mini,由于它们的 GPU 和分辨率均相同,可是延续这个思路实际上是有不少解决方案的,好比你们能够研究下这两个设备的话筒和喇叭个数,而这个数量也是能够经过 JS 获取的 :Pcanvas