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

作者:纸飞机

时间:2026-10-22

浏览:532

本文介绍了两种在JavaScript中获取移动设备型号的方法。第一种通过Canvas API获取GPU型号并结合屏幕分辨率来推断iOS设备型号;第二种利用navigator.userAgent字段解析Android手机型号,并推荐使用mobile-detect.js库进行更全面的设备参数检测。

文章目录

通过GPU型号与分辨率识别iOS设备

我们通常在浏览器中通过User Agent字段来识别用户的访问设备,但这只能提供大致信息,如操作系统类型(Mac或Windows)或设备类别(iPhone或iPad)。若需精确识别具体设备型号(例如第几代iPhone),该方法则显得力不从心。此前,笔者有识别移动客户端具体型号(主要为iOS设备)的需求,经过思考,探索出一种可行的实现思路。

起初,笔者尝试沿用User Agent方案,但发现此路不通。在逐一测试浏览器API的过程中,受一篇关于通过JavaScript获取图形设备信息文章的启发。由于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可方便获取屏幕分辨率,因此将GPU型号与分辨率结合使用,即可准确判断设备型号。

此处提供示例网址,用户可使用手机访问进行测试: https://joyqi.github.io/mobile-device-js/example.html

完整代码已托管至GitHub: https://github.com/joyqi/mobile-device-js

此次思考为解决问题提供了新视角,即从侧面入手可能带来新的发现。例如,当前代码尚无法区分同一代iPad Air和iPad mini,因为它们的GPU型号和分辨率均相同。但延续此思路仍有多种解决方案,如研究设备的麦克风和扬声器数量,这些参数同样可通过JavaScript获取。

完整的测试代码


<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;
})();

通过User Agent解析Android手机型号

JS获取手机型号和系统

若要通过JavaScript获取手机基本参数,需使用navigator.userAgent,从中可获取浏览器的基本信息。若需在页面中查看navigator.userAgent的内容,可使用document.write(navigator.userAgent)将其打印到页面上,以便更清晰地查看具体内容。

以下是笔者在部分手机中打印的userAgent内容:

1、iPhone 6 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 iPhone 7 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的User Agent中包含“iPhone”字段,系统版本位于标红部分。第2、3、4项为Android手机的User Agent内容,仔细观察可知“Android 5.1”等即为系统版本,蓝色部分为手机型号。其他内容包含浏览器版本等,此处不再赘述。如需了解User Agent的具体含义和来源,可参考以下地址查看详细解释:

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

使用mobile-detect.js库进行设备检测

2、经网络搜索,发现存在可直接实现此功能的JavaScript库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

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章