思路清奇:通過 JavaScript 獲取移動裝置的型號

發表於2017-07-14

我們一般在瀏覽器裡識別使用者的訪問裝置都是通過 User Agent 這個欄位來獲取的,但是通過它我們只能獲取一個大概的資訊,比如你用的是 Mac 還是 Windows,用的是 iPhone 還是 iPad。如果我想知道你用的是第幾代 iPhone,這個方法就不行了,前段時間我正好有這個需求,識別移動客戶端的具體型號(主要是 iOS 裝置),於是思考了下這個問題的實現。

首先,我跟大家一樣想到了 UA,不過事實證明這路走不通。就在我無聊一個一個擺弄瀏覽器的 API 時,突然一篇文章裡的某段程式碼提醒了了我。這篇文章講的是怎樣通過 js 獲取圖形裝置資訊的,因為 HTML5 支援了 canvas,所以可以通過 API 獲取圖形裝置的型號,比如顯示卡的型號。

執行這段程式碼就可以獲取顯示卡的型號了,如果你在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/mobil…

我的程式碼都放在了 GitHub 上
https://github.com/joyqi/mobi…

這次思考給了我一些解決問題的啟發,我們在思考解決方案的時候從側面入手說不定會有新的發現。就比如我們的這個程式碼,目前還無法識別同一代的 iPad Air 和 iPad mini,因為它們的 GPU 和解析度均相同,但是延續這個思路其實是有很多解決方案的,比如大家可以研究下這兩個裝置的話筒和喇叭個數,而這個數量也是可以通過 JS 獲取的 :P

相關文章