JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)


Posted in Javascript onMarch 10, 2018

我们一般在浏览器里识别用户的访问设备都是通过 User Agent 这个字段来获取的,但是通过它我们只能获取一个大概的信息,比如你用的是 Mac 还是 Windows,用的是 iPhone 还是 iPad。如果我想知道你用的是第几代 iPhone,这个方法就不行了,前段时间我正好有这个需求,识别移动客户端的具体型号(主要是 iOS 设备),于是思考了下这个问题的实现。

首先,我跟大家一样想到了 UA,不过事实证明这路走不通。就在我无聊一个一个摆弄浏览器的 API 时,突然一篇文章里的某段代码提醒了了我。这篇文章讲的是怎样通过 js 获取图形设备信息的,因为 HTML5 支持了 canvas,所以可以通过 API 获取图形设备的型号,比如显卡的型号。

(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 的型号来辨别设备的型号。

不过这还有个小瑕疵,有些设备是同一代,也就是 GPU 型号完全相同,比如 iPhone 6s, iPhone 6s Plus, iPhone SE。它们用的都是 Apple A9 GPU,怎么区分开它们呢?你会发现它们最大的不同不就是分辨率不同吗?而通过 JavaScript 我们又可以方便地获取屏幕分辨率,这样把两个手段综合应用一下就可以获取设备的准确型号了。

这里有个示例网址,大家可以用手机访问
https://joyqi.github.io/mobile-device-js/example.html

我的代码都放在了 GitHub 上
https://github.com/joyqi/mobile-device-js

这次思考给了我一些解决问题的启发,我们在思考解决方案的时候从侧面入手说不定会有新的发现。就比如我们的这个代码,目前还无法识别同一代的 iPad Air 和 iPad mini,因为它们的 GPU 和分辨率均相同,但是延续这个思路其实是有很多解决方案的,比如大家可以研究下这两个设备的话筒和喇叭个数,而这个数量也是可以通过 JS 获取的 :P

完整的测试代码

<html>
  <head>
    <title>Mobile Device Example</title>
    <script src="./device.js"></script>
  </head>
  <head>
    <h1>GPU: <script>document.write(MobileDevice.getGlRenderer());</script></h1>
    <h1>Device Models: <script>document.write(MobileDevice.getModels().join(' or '));</script></h1>
  </head>
</html>

device.js

(function () {
  var canvas, gl, glRenderer, models,
    devices = {
      "Apple A7 GPU": {
        1136: ["iPhone 5", "iPhone 5s"],
        2048: ["iPad Air", "iPad Mini 2", "iPad Mini 3"]
      },

      "Apple A8 GPU": {
        1136: ["iPod touch (6th generation)"],
        1334: ["iPhone 6"],
        2001: ["iPhone 6 Plus"],
        2048: ["iPad Air 2", "iPad Mini 4"]
      },

      "Apple A9 GPU": {
        1136: ["iPhone SE"],
        1334: ["iPhone 6s"],
        2001: ["iPhone 6s Plus"],
        2224: ["iPad Pro (9.7-inch)"],
        2732: ["iPad Pro (12.9-inch)"]
      },

      "Apple A10 GPU": {
        1334: ["iPhone 7"],
        2001: ["iPhone 7 Plus"]
      }
    };

  function getCanvas() {
    if (canvas == null) {
      canvas = document.createElement('canvas');
    }

    return canvas;
  }

  function getGl() {
    if (gl == null) {
      gl = getCanvas().getContext('experimental-webgl');
    }

    return gl;
  }

  function getScreenWidth() {
    return Math.max(screen.width, screen.height) * (window.devicePixelRatio || 1);
  }

  function getGlRenderer() {
    if (glRenderer == null) {
      debugInfo = getGl().getExtension('WEBGL_debug_renderer_info');
      glRenderer = debugInfo == null ? 'unknown' : getGl().getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
    }

    return glRenderer;
  }

  function getModels() {
    if (models == null) {
      var device = devices[getGlRenderer()];

      if (device == undefined) {
        models = ['unknown'];
      } else {
        models = device[getScreenWidth()];

        if (models == undefined) {
          models = ['unknown'];
        }
      }
    }

    return models;
  }

  if (window.MobileDevice == undefined) {
    window.MobileDevice = {};
  }

  window.MobileDevice.getGlRenderer = getGlRenderer;
  window.MobileDevice.getModels = getModels;
})();

JS获取手机型号和系统

想要通过js获取手机的一些基本参数,就要使用到navigator.userAgent,通过我们可以获取到浏览器的一些基本信息。如果想在页面中看到navigator.userAgent内容,我们可以使用document.write(navigator.userAgent);打印到页面上,可以更清晰的看到具体内容。

1、下面是我打印的一些手机中的userAgent内容:

1、iphone6 plus
Mozilla/5.0 (iPhone; CPU iPhone OS <span style="color:#ff0000;">10_2_1</span> like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Mobile/14D27

iphone7 plus
Mozilla/5.0 (iPhone; CPU iPhone OS <span style="color:#ff0000;">10_3_1</span> like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E304

2、魅族
Mozilla/5.0 (Linux; <span style="color:#ff0000;">Android 5.1</span>; <span style="color:#3366ff;">m1 metal</span> Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.127 Mobile Safari/537.36

3、三星
Mozilla/5.0 (Linux; <span style="color:#ff0000;">Android 6.0.1</span>; <span style="color:#3366ff;">SM-A8000</span> Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36

4、小米
Mozilla/5.0 (Linux; <span style="color:#ff0000;">Android 6.0.1</span>; <span style="color:#3366ff;">Redmi Note 4X</span> Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36

从上面我们可以看出iphone的里面都含有iPhone字段,系统版本字段为上面标红的地方。2、3、4是几款Android手机的userAgent内容,仔细观察不难发现Android 5.1等就是系统版本。而蓝色的就是手机型号。至于其他内容,包含浏览器版本等,这里不做解释。如果想知道这个userAgent内容的具体含义和来源可以参考如下地址查看具体解释:

为什么所有浏览器的userAgent都带Mozilla

2、在网上查了下有木有现成的js能直接实现此功能,找到了一个mobile-detect.js。基本可以实现我们需要的参数,下载地址:

https://github.com/hgoebl/mobile-detect.js/

文档地址:

http://hgoebl.github.io/mobile-detect.js/doc/MobileDetect.html

使用方法:

var md = new MobileDetect( 
  'Mozilla/5.0 (Linux; U; Android 4.0.3; en-in; SonyEricssonMT11i' + 
  ' Build/4.1.A.0.562) AppleWebKit/534.30 (KHTML, like Gecko)' + 
  ' Version/4.0 Mobile Safari/534.30'); 
 
// more typically we would instantiate with 'window.navigator.userAgent' 
// as user-agent; this string literal is only for better understanding 
 
console.log( md.mobile() );     // 'Sony' 
console.log( md.phone() );      // 'Sony' 
console.log( md.tablet() );     // null 
console.log( md.userAgent() );    // 'Safari' 
console.log( md.os() );       // 'AndroidOS' 
console.log( md.is('iPhone') );   // false 
console.log( md.is('bot') );     // false 
console.log( md.version('Webkit') );     // 534.3 
console.log( md.versionStr('Build') );    // '4.1.A.0.562' 
console.log( md.match('playstation|xbox') ); // false

使用过程中ios没有什么问题,想获取的都可以获取到,不过Android并不是都能获取到。所以又对Android的做了单独处理。发现Android手机型号后面都带了一段Build/...。所以就以此做了下单独处理,来获取Android手机型号。下面是具体代码:

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<meta name="viewport" 
  content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no"> 
<title>JS获取手机型号和系统</title> 
</head> 
<body> 
</body> 
<script src="js/lib/jquery-1.11.1.min.js"></script> 
<script src="js/lib/mobile-detect.min.js"></script> 
<script> 
  //判断数组中是否包含某字符串 
  Array.prototype.contains = function(needle) { 
    for (i in this) { 
      if (this[i].indexOf(needle) > 0) 
        return i; 
    } 
    return -1; 
  } 
 
  var device_type = navigator.userAgent;//获取userAgent信息 
  document.write(device_type);//打印到页面 
  var md = new MobileDetect(device_type);//初始化mobile-detect 
  var os = md.os();//获取系统 
  var model = ""; 
  if (os == "iOS") {//ios系统的处理 
    os = md.os() + md.version("iPhone"); 
    model = md.mobile(); 
  } else if (os == "AndroidOS") {//Android系统的处理 
    os = md.os() + md.version("Android"); 
    var sss = device_type.split(";"); 
    var i = sss.contains("Build/"); 
    if (i > -1) { 
      model = sss[i].substring(0, sss[i].indexOf("Build/")); 
    } 
  } 
  alert(os + "---" + model);//打印系统版本和手机型号 
</script> 
</html>

得到结果:

iphone iOS10.21---iPhone

android AndroidOS6.01---Redmi Note 4X

Javascript 相关文章推荐
ExtJS扩展 垂直tabLayout实现代码
Jun 21 Javascript
JavaScript 5 新增 Array 方法实现介绍
Feb 06 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
May 11 Javascript
JS动态添加与删除select中的Option对象(示例代码)
Dec 20 Javascript
javascript读写json示例
Apr 11 Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 Javascript
Javascript HTML5 Canvas实现的一个画板
Apr 12 Javascript
jQuery中fadein与fadeout方法用法示例
Sep 16 Javascript
原生js实现的金山打字小游戏(实例代码详解)
Mar 16 Javascript
基于Vue全局组件与局部组件的区别说明
Aug 11 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 Javascript
vue项目实现减少app.js和vender.js的体积操作
Nov 12 Javascript
js经验分享 JavaScript反调试技巧
Mar 10 #Javascript
webpack打包node.js后端项目的方法
Mar 10 #Javascript
webpack external模块的具体使用
Mar 10 #Javascript
webpack组织模块打包Library的原理及实现
Mar 10 #Javascript
浅谈webpack组织模块的原理
Mar 10 #Javascript
Vuex实现计数器以及列表展示效果
Mar 10 #Javascript
在vue中使用css modules替代scroped的方法
Mar 10 #Javascript
You might like
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
学习Node.js模块机制
2016/10/17 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
微信小程序block的使用教程
2018/04/01 Javascript
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
Python导出DBF文件到Excel的方法
2015/07/25 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
django使用LDAP验证的方法示例
2018/12/10 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
python实现加密的方式总结
2020/01/19 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
基于python实现坦克大战游戏
2020/10/27 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
集中整治工作方案
2014/05/01 职场文书
禁毒宣传标语
2014/06/19 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python