はじめに
自分はそんなにmacユーザってわけでもないので、
このmacについて
からバージョン番号(10.9.4みたいの)を見てもOSの名前がすぐ出てきません。(コードネームっていうらしい)
なので、バージョンからMac OSの名前(コードネーム)を出すようなやつないかなーってことで、適当ですが書いてみました。こんな感じ
mac以外は全部名無しとかにしてますw
github
githubにもあげてあるので最初に晒しておきます
https://github.com/tweeeety/macos-identifier
こんな実装
概要
やってることはほんといたってアナログ的です。
uaからバージョンらしきものを抜き出して、用意しておいた'version'=>'codename'
のhashから引いてきただけです。
ua
uaはjsであればwindow.navigator.userAgent
でとれます
console.log(window.navigator.userAgent); // こんな感じで表示される Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 : Mavericks
version=>codenameのhash
下記のサイトを参考にさせて頂きました。
→Mac OS X バージョンとコードネーム
これをもとに'10.7' => 'Lion'
のような形で定義しただけです。
- 一部抜粋
this.hash = { '10.0' : 'Cheetah', '10.1' : 'Puma', '10.2' : 'Jaguar', '10.3' : 'Panther', '10.4' : 'Tiger', '10.5' : 'Leopard', '10.6' : 'Snow Leopard', '10.7' : 'Lion', '10.8' : 'Mountain Lion', '10.9' : 'Mavericks', '10.10' : 'Yosemite' }
本体ソース
githubにあげてあるのでそちらで見れますがこんな感じ。
おもいっきし強引に正規表現ってます。いけてないw
var MacOSIdentifier = (function() { var constructor = function() { this.hash = { '10.0' : 'Cheetah', '10.1' : 'Puma', '10.2' : 'Jaguar', '10.3' : 'Panther', '10.4' : 'Tiger', '10.5' : 'Leopard', '10.6' : 'Snow Leopard', '10.7' : 'Lion', '10.8' : 'Mountain Lion', '10.9' : 'Mavericks', '10.10' : 'Yosemite' } }; constructor.prototype.judgeVer = function(ua){ //var ua = window.navigator.userAgent; // 最小マッチ var osStr = ua.match(/.*\(.+((:?Mac).+?)\).*/); if( !osStr ) { return null }; //console.log(osStr); var tmp = osStr[1]; //console.log(ua); //console.log(tmp); var tmps = tmp.split(";"); //console.log(tmps); var osVerStr = tmps[0]; var osVer = osVerStr.match(/.*(\d{2}(:?[\.|\_]+)\d+)(:?[\.|\_]+.*)?/); if( !osVer ) { return null }; return (osVer[1]? osVer[1] : null); } constructor.prototype.formatVer = function(str) { var newStr = str.replace('_', '.'); var newStrs = newStr.split('.'); return newStrs[0] + '.' + newStrs[1]; } constructor.prototype.ver2Name = function(ver) { //console.log(this.hash); return this.hash[ver] || null; } constructor.prototype.judge = function(ua) { var osVer = this.judgeVer(ua); //console.log(osVer); if( !osVer ) { return undefined }; osVer = this.formatVer(osVer); //console.log(osVer); var codeName = this.ver2Name(osVer); return codeName || undefined; } return constructor; })();
ほんの少しはテスト
申し訳程度ですが、こんな感じで確認してみました。
一部、usリストのOpera 10
の扱いがよくわかりませんでした。
uaのサンプルは下記のサイトを参考にさせて頂きました。 →ユーザーエージェント
完成形
テストもろくにしてないし完成形というにはおこがましい出来ですが、
まぁ自分が使いたかっただけなのでw
こんな感じです。
まとめ
ってことで完全自分が後で使いたいだけのメモ記事\(^o^)/
とはいえ間違ってたら教えてください!