JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
本文介绍了两种在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
JS动态构建复杂嵌套JSON对象的方法
2026-11-05 15:41:52
JS负数取余为什么是负数?详解余数与模运算区别
2026-11-05 13:34:41
JS 解压出现乱码或报错怎么解决?
2026-11-05 12:32:38
JS 中 startsWith、indexOf 与正则判断字符串前缀的对比
2026-11-04 22:19:43
JS解析Excel后怎么将数据转换为JSON格式
2026-11-04 20:58:28
