Skip to content
uupaa edited this page Feb 3, 2014 · 28 revisions

DeviceQuery.js

DeviceQuery.js は https://github.com/uupaa/DeviceQuery.js で公開されている JavaScript ライブラリです。

Device.js に登録されている iPhone, Android, WindowsPhone のデバイス情報を検索します。

Browser, WebWorkers, Node.js 環境で動作し、Closure Compiler で Minify した状態でも動作します。

npm install uupaa.devicequery.js コマンドでインストールします。
ブラウザからは、<script src="./lib/DeviceQuery.js"></script> で、
node.js からは require("uupaa.devicequery.js") で利用できます。

DeviceQuery.js を組み込むと、global.DeviceQuery() が利用可能になります。

## DeviceQuery

DeviceQuery(selector:DeviceQueryString, caseSensitive:Boolean = false):IDArray は、
selector に指定された検索式で DEVICE_CATALOGSOC_CATALOG から絞込検索を行い、見つかった ID を配列で返します。

selector は、 KEYWORD 条件式 VALUE;... のように指定します。セミコロン(;) で式を連結することで、さらに絞り込めます。
指定可能な KEYWORD と 条件式(OPERATOR), VALUE の組み合わせは以下の表を参考にしてください。

caseSensitive に true を指定すると大小文字を区別して検索します。

KEYWORD
DEVICE.BRAND DeviceQuery("DEVICE.BRAND = Google; GPU.TYPE = POWERVR")
DEVICE.SOC DeviceQuery("DEVICE.SOC = MSM8960")
OS.TYPE DeviceQuery("OS.TYPE = Android")
OS.VERSION.PRE DeviceQuery("OS.TYPE = Android; OS.VERSION.PRE >= 2.3")
OS.VERSION.HIGHEST DeviceQuery("OS.TYPE = Android; OS.VERSION.PRE >= 2.3; OS.VERSION.HIGHEST < 4.4")
CPU.TYPE DeviceQuery("CPU.TYPE = ARM"); // ARM SoC
CPU.CLOCK DeviceQuery("CPU.CLOCK > 1.0"); // CPUクロックが1.0GHz以上のSoC
CPU.CORES DeviceQuery("CPU.CORES >= 2"); // CPUコア数が2以上のSoC
GPU.TYPE DeviceQuery("GPU.TYPE = POWERVR; DEVICE.BRAND = Google");
// GPUがPowerVRでGoogleブランドの端末
GPU.ID DeviceQuery("GPU.TYPE = Adreno ; GPU.ID = 320")
INPUT.TOUCHES DeviceQuery("INPUT.TOUCHES = 1")
MEMORY.RAM DeviceQuery("MEMORY.RAM >= 1.5")
DISPLAY.SHORT DeviceQuery("DISPLAY.SHORT < 480")
DISPLAY.LONG DeviceQuery("DISPLAY.LONG >= 1200")
DISPLAY.PPI DeviceQuery("DISPLAY.PPI >= 200")
DISPLAY.DPR DeviceQuery("DISPLAY.DPR >= 2")
OPERATOR
= または == DeviceQuery("OS.TYPE = Android")
<= DeviceQuery("OS.VERSION.PRE <= 4.2")
>= DeviceQuery("DISPLAY.LONG >= 1200")
< DeviceQuery("DISPLAY.LONG < 1200")
> DeviceQuery("DISPLAY.LONG > 1200")

Device.js の DEVICE_CATALOG や SOC_CATALOG の値が 0 または "" の項目は検索にヒットしません。

function DeviceQuery(selector,        // @arg DeviceQueryString: query string. "GPU.TYPE=Adreno;GPU.ID=330"
                     caseSensitive) { // @arg Boolean(= false): true is case-sensitive, false is ignore case.
                                      // @ret IDArray: [id, ...]
                                      // @help: DeviceQuery
                                      // @desc: Query device catlog.

    return _filter( _processing( _parse(selector) ), caseSensitive || false );
}
DeviceQuery("DEVICE.SOC = MSM8960");
// ["SH-03F", "L-02E", "N-02E", "N-05E", "SH-01E", "SH-01EVW", "SH-05E", "SO-01E", "F-03E", "HW-01E", "L-05D", "N-07D", "N-08D", "SC-06D", "SH-09D", "SH-10D", "SO-04D", "SO-05D", "P-07D", "T-02D", "KYY21", "SHT21", "SCL21", "CAL21", "SHL21", "KYL21", "FJL21", "SOL21", "PTL21", "101F", "201HW", "SBM200SH", "201K", "DM014SH", "201M", "SBM205SH", "202K", "WX10K", "DM015K", "8X", "Lumia 620", "Lumia 820", "Lumia 822", "Lumia 920", "Lumia 925", "Lumia 928", "Lumia 1020", "GT-I8750", "SGH-T899M", "SCH-I930"]
// iOS デバイスの情報をダンプする
DeviceQuery("OS.TYPE = iOS").forEach(function(id) {
  console.log( JSON.stringify( Device.toSpecObject(id) ) );
});
// {"DEVICE":{"ID":"iPod touch 3","MAYBE":false,"BRAND":"Apple","SOC":"S5PC100","GPS":false},"OS":{"TYPE":"","VERSION":{"CURRENT":{"MAJOR":0,"MINOR":0,"PATCH":0},"PRE":{"MAJOR":3,"MINOR":1,"PATCH":0},"HIGHEST":{"MAJOR":5,"MINOR":1,"PATCH":1}}},"CPU":{"TYPE":"ARM","CLOCK":0.6,"CORES":1,"SIMD":true},"GPU":{"TYPE":"PowerVR","ID":"SGX535"},"INPUT":{"TOUCH":true,"TOUCHES":5},"MEMORY":{"RAM":0.125},"DISPLAY":{"PPI":326,"DPR":2,"LONG":960,"SHORT":640},"NETWORK":{"3G":false,"LTE":false,"NFC":false,"WIFI":true},"BROWSER":{"USER_AGENT":""}}
// {"DEVICE":{"ID":"iPod touch 4","MAYBE":false,"BRAND":"Apple","SOC":"A4","GPS":false},"OS":{"TYPE":"","VERSION":{"CURRENT":{"MAJOR":0,"MINOR":0,"PATCH":0},"PRE":{"MAJOR":4,"MINOR":1,"PATCH":0},"HIGHEST":{"MAJOR":6,"MINOR":1,"PATCH":5}}},"CPU":{"TYPE":"ARM","CLOCK":0.8,"CORES":1,"SIMD":true},"GPU":{"TYPE":"PowerVR","ID":"SGX535"},"INPUT":{"TOUCH":true,"TOUCHES":5},"MEMORY":{"RAM":0.25},"DISPLAY":{"PPI":326,"DPR":2,"LONG":960,"SHORT":640},"NETWORK":{"3G":false,"LTE":false,"NFC":false,"WIFI":true},"BROWSER":{"USER_AGENT":""}} 
// Google(Nexus) ブランドの端末名の一覧をダンプする
DeviceQuery("DEVICE.BRAND = Google");
// ["Nexus One", "Nexus S", "Galaxy Nexus", "Nexus 4", "Nexus 5", "Nexus 7", "Nexus 7 (2013)", "Nexus 10", "EM01L"]

絞込の順番により結果が変わります

最後の検索式が CPU.*** または GPU.*** なら SoC ID の配列を返し、それ以外の場合は Device ID の配列を返します。

つまり、
GPU.TYPE ; DEVICE.BRAND 順に検索した場合と、
DEVICE.BRAND ; GPU.TYPE 順に検索した場合では検索結果が異なります。

Query Result
DeviceQuery("GPU.TYPE = POWERVR; DEVICE.BRAND = Google") ["Nexus S", "Galaxy Nexus"] Device ID の配列
DeviceQuery("DEVICE.BRAND = Google; GPU.TYPE = POWERVR") ["OMAP4460", "S5PC110"] SoC ID の配列