JavaScriptでiOSデバイスの機種名をどこまで識別できるのか。

…ということで、iPhone / iPad / iPod touch の機種名や世代を、JavaScriptを使って特定してみます。

 → 動作デモとサンプルコードはこちら。
手元には iOS 6 な iPhone 4S と 3GS しか無いので、充分なテストはしていません。
不具合などあれば教えて頂けると。

まずは navigator.userAgent あるいは navigator.platform の文字列を見ることで、とりあえず iPhone か iPad か iPod touch かの区別はつきます。
  • iPhone には "iPhone" という文字列が含まれる。
  • iPad には "iPad" という文字列が含まれる。
  • iPod touch には "iPod" という文字列が含まれる。
iPhoneであるという事が判ったら、screen.width と screen.height の値を取得して、
  • screen.width : screen.height = 16 : 9 ならば iPhone 5 であることが確定
  • 4 : 3 ならば iPhone 4S 以前の機種である。
と切り分け出来ます。

次に、アスペクト比が 4 : 3 だった機種のうち、iPhone 4 と 4S は Retinaディスプレイが搭載されています。window.devicePixelRatio の値を見て、
画面のアスペクト比が 4 : 3 の iPhone のうち、
  • window.devicePixelRatio == 2 ならば Retina。すなわち 4 か 4S。
  • window.devicePixelRatio == 1 であれば 3GS 以前の機種である。
と判断できます。

さて、4 と 4S の判別です。これは確実に切り分けることができません。ただし、iOSのバージョンが 4 であれば、その機種は確実に iPhone 4 です。
OSのバージョンは navigator.userAgent から得ることができます。iPhone 4S は、発売時に既に iOS 5 が載っていたので、OSのバージョンが "4.x" ということは有り得ません。
アスペクト比が 4 : 3 で Retinaディスプレイ搭載機種のうち、
  • iOSのバージョンが "4.x" ならば iPhone 4 確定
  • バージョンが 5 以上ならば iPhone 4 または iPhone 4S。この区別はできない。
初代 iPhone / 3G / 3GS も確実に切り分ける方法はなさそうです。こちらも OS のバージョンを見ることによって、多少は絞り込めます。
アスペクト比が 4 : 3 で Retinaディスプレイ搭載機種のうち、
  • iOS のバージョンが "5.x" "6.x" ならば iPhone 3GS 確定。(それ以前の機種では iOS5、6 はサポートされません)
  • OS のバージョンが "1.x" ならば 初代iPhone確定
  • OS のバージョンが "2.x" ならば 初代か 3G。
  • OS のバージョンが "3.x" または "4.x" ならば 初代か 3G か 3GS。

iPad は全ての機種がアスペクト比 4 : 3 なのですが、iPhoneと同様にRetinaかどうかを見て、
  • window.devicePixelRatio == 2 ならば iPad 3rd または 4th。
    • iOS 5.x が走っていれば iPad 3rd 確定
    • iOS 6.x ならば 3rd または 4th。
  • window.devicePixelRatio == 1 ならば 初代iPad、iPad 2、iPad mini のいずれか。
    • iOS 3.x ならば 初代iPad確定
    • iOS 4.x、5.x ならば 初代 または 2。
    • iOS 6.x であれば、iPad 2 または iPad mini。

iPod touch は、
  • アスペクト比が 16 : 9 ならば 5th 確定
  • アスペクト比が 4 : 3 の機種のうち
    • window.devicePixelRatio == 2 ならば 4th 確定
    • window.devicePixelRatio == 1 の機種で、
      • OS のバージョンが "1.x" ならば 1st 確定
      • "5.x" ならば 3rd 確定
      • "2.x" ならば 1st、2nd のいずれか。
      • "3.x" ならば 1st、2nd、3rd のいずれか。
      • "4.x" ならば 2nd、3rd のいずれか。
デバイスにカメラが搭載されているかどうかなどを JavaScript から判別できれば、もう少し機種を絞り込めそうなのだけれど、そんな方法は無いのだろうなぁ。

まあ実用的にはここまで細かく機種名を判別する意味も必要性も無いのですが。

カテゴリ: