首頁  >  文章  >  web前端  >  JavaScript取得行動裝置型號的實作代碼(JS取得手機型號與系統)

JavaScript取得行動裝置型號的實作代碼(JS取得手機型號與系統)

亚连
亚连原創
2018-05-31 10:33:436905瀏覽

這篇文章主要介紹了JavaScript獲取行動裝置型號的實現代碼,需要的朋友可以參考下

我們一般在瀏覽器裡識別用戶的訪問設備都是透過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(&#39; or &#39;));</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(&#39;canvas&#39;);
    }

    return canvas;
  }

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

    return gl;
  }

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

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

    return glRenderer;
  }

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

      if (device == undefined) {
        models = [&#39;unknown&#39;];
      } else {
        models = device[getScreenWidth()];

        if (models == undefined) {
          models = [&#39;unknown&#39;];
        }
      }
    }

    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 e9ba17b97217ae2fd3f892935d053cd710_2_154bdf357c58b8a65c66d7c19c8e4d114 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Mobile/14D27 

CPU7 plus 
Mozilla/5.0 (iphone) CPU; a80cef128d8e145f6c8ee3fc2423b6bb10_3_154bdf357c58b8a65c66d7c19c8e4d114 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E304 

#2、魅族Mozilla/5.0 (Linux; a80cef128d8e145f6c8ee3fc2423b6bbAndroid 5.154bdf357c58b8a65c66d7c19c8e4d114; 23b116612d380f011eb8a2f2f43b221dm1 metal54bdf357c58b8a65c66d7c19c8e4d114 Build/gt; LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.127 Mobile Safari/537.36 

3、三星 
Mozilla/5.0 (Linilla style <color; ff0000;">Android 6.0.154bdf357c58b8a65c66d7c19c8e4d114; 23b116612d380f011eb8a2f2f43b221dSM-A800054bdf357c58b8a65c66d7c19c8e4d114 Build/MMB29M; wv) AppleWebKit/537.36 (KHTMLo) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36 

4、小米 
Mozilla/5.0 (Linux; a80cef128d8e145f6c8ee3fc2423b6bbAndroid 6.0.1</style="color:#ff0000;">Android 6.0.12068a46e79bb72235661863fa81186f5; 23b116612d380f011eb8a2f2f43b221dRedmi Note 4X54bdf357c58b8a65c66d7c19c8e4d114 Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.012883.1281/Mobile 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( 
  &#39;Mozilla/5.0 (Linux; U; Android 4.0.3; en-in; SonyEricssonMT11i&#39; + 
  &#39; Build/4.1.A.0.562) AppleWebKit/534.30 (KHTML, like Gecko)&#39; + 
  &#39; Version/4.0 Mobile Safari/534.30&#39;); 
 
// more typically we would instantiate with &#39;window.navigator.userAgent&#39; 
// as user-agent; this string literal is only for better understanding 
 
console.log( md.mobile() );     // &#39;Sony&#39; 
console.log( md.phone() );      // &#39;Sony&#39; 
console.log( md.tablet() );     // null 
console.log( md.userAgent() );    // &#39;Safari&#39; 
console.log( md.os() );       // &#39;AndroidOS&#39; 
console.log( md.is(&#39;iPhone&#39;) );   // false 
console.log( md.is(&#39;bot&#39;) );     // false 
console.log( md.version(&#39;Webkit&#39;) );     // 534.3 
console.log( md.versionStr(&#39;Build&#39;) );    // &#39;4.1.A.0.562&#39; 
console.log( md.match(&#39;playstation|xbox&#39;) ); // 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实现区块链

iview table render集成switch开关的实例

解决Vue.js 2.0 有时双向绑定img src属性失败的问题

以上是JavaScript取得行動裝置型號的實作代碼(JS取得手機型號與系統)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn