Air for iOS デバイスCPU世代判定クラス

Air for iOSにて、デバイス世代判定クラスを書いてみました。参考までにメモ。

一つ前に、Air for iOS CPU世代メモ というエントリーをしましたが、
as3で取り扱いやすいようにクラスにしてみました。

もう既にあったりしそうですが、、、デバイスタイプ、CPU世代判定クラスOSiOSです。
テストがあまいですが。。。ページ下に使用方法が。

クラスOSiOS

package 
{
			
	import flash.system.Capabilities;

	public class OSiOS
	{
		
		//世代定義
		static public const GENERATION_0:Number = 0;
		static public const GENERATION_1:Number = 1;	//A4 single core
		static public const GENERATION_2:Number = 2;	//A5 dual-core
		static public const GENERATION_3:Number = 3;	//A5X dual-core
		static public const GENERATION_4:Number = 4;	//A6 dual-core
		static public const GENERATION_5:Number = 5;	//A6X dual-core
		static public const GENERATION_NEWER:Number = Number.MAX_VALUE 
		
		//デバイス定義
		static public const DEVICE_IPOD:String = "deviceipod"
		static public const DEVICE_IPHONE:String = "deviceiphone"
		static public const DEVICE_IPAD:String = "deviceipad"
				
		static protected var instance:OSiOS;
		
		public function OSiOS(abc:Abc)
		{
			
			var _os:String = Capabilities.os.toLowerCase();	//ex iPhone OS 6.1.3 iPhone5,2
			isiOS = Boolean(_os.indexOf('iphone os') != -1);
			
			if(isiOS){

				var _att:Array = _os.split(" ");
				var _version:String = _att[2]; 
				var _tmpdevice:Array = _att[3].split(",");
				var _device:String = _tmpdevice[0];
				var myPattern:RegExp = /[0-9|\.]+/g;
				var __result:Object = myPattern.exec(_device);
				var _device_version:Number = Number(__result[0]); 
				var _device_num:Number = Number(_tmpdevice[1]);
					
				this.generation = GENERATION_NEWER;
				
				//touch
				if(Boolean(_device.indexOf('ipod') != -1)){
					
					this.type = DEVICE_IPOD;
					
					if(_device_version < 4){
						//ipod touch 1st,2nd,3rd
						this.generation = GENERATION_0;
					}else if(_device_version == 4){
						//ipod touch 4th
						this.generation = GENERATION_1;
					}else if(_device_version == 5){
						//ipod touch 5th
						this.generation = GENERATION_2;
					}else{
						//ipod touch newer
						this.generation = GENERATION_NEWER;
					}
					
				//iphone
				}else if(Boolean(_device.indexOf('iphone') != -1)){
					
					this.type = DEVICE_IPHONE;
					
					if(_device_version <= 2){
						//iphone 3gs
						this.generation = GENERATION_0;
					}else if(_device_version == 3){
						//iphone 4
						this.generation = GENERATION_1;
					}else if(_device_version == 4){
						//iphone 4s
						this.generation = GENERATION_2;
					}else if(_device_version == 5){
						//iphone 5
						this.generation = GENERATION_4;
					}else{
						//iphone newer
						this.generation = GENERATION_NEWER;
					}
					
				//ipad
				}else if(Boolean(_device.indexOf('ipad') != -1)){
				
					this.type = DEVICE_IPAD;
					
					if(_device_version <= 1){
						//ipad 1st
						this.generation = GENERATION_1;
					}else if(_device_version == 2){
						//ipad 2nd
						this.generation = GENERATION_2;
					}else if(_device_version == 3){
						//ipad 3rd
						this.generation = GENERATION_3;
						if(_device_num == 4){
							//ipad 4th
							this.generation = GENERATION_5;
						}
					}else{
						//ipad newer
						this.generation = GENERATION_NEWER;
					}
					
				//その他のデバイス
				}else{
					
					//シュミレーター扱いとする
					this.isSimulator = true;
					
					if(Capabilities.screenResolutionY > 1136){
						this.type = DEVICE_IPAD;
						//retina ipad (etc 3rd)
						this.generation = GENERATION_3;
					}else if(Capabilities.screenResolutionY == 1024){
						this.type = DEVICE_IPAD;
						//ipad (etc 2nd)
						this.generation = GENERATION_2;
					}else if(Capabilities.screenResolutionY == 1136){
						this.type = DEVICE_IPHONE;
						//retina 5 ...
						this.generation = GENERATION_3;
					}else if(Capabilities.screenResolutionY > 480){
						this.type = DEVICE_IPHONE;
						//retina 4,4s
						this.generation = GENERATION_2;
					}else{
						this.type = DEVICE_IPHONE;
						//not-retina 3G,3Gs
						this.generation = GENERATION_0;
					}
					
				}
			}
		}
		
		static public function getInstance():OSiOS{
			if(!instance){
				instance = new OSiOS(new Abc());
			}
			return instance;
		}
		
		/**
		 * シュミレーターでの実行かどうか
		 */
		public var isSimulator:Boolean = false;
		static public function isSimulator():Boolean{
			return getInstance().isSimulator;
		}
		
		/**
		 * iOSデバイスかどうか
		 */
		public var isiOS:Boolean = false;
		static public function isiOS():Boolean{
			return getInstance().isiOS;
		}
		
		/**
		 * デバイスの世代
		 */
		public var generation:Number;
		static public function generation():Number{
			return getInstance().generation;
		}
		
		/**
		 * デバイスタイプ
		 */
		public var type:String;
		static public function type():String{
			return getInstance().type;
		}		
	}
}
class Abc{
	public function Abc(){}
}

使い方

if(OSiOS.isiOS()){//iOS判定

	trace("シュミレーター実行かどうか:" + OSiOS.isSimulator());
	
	trace("デバイスタイプ:");
	switch(OSiOS.type())
	{
		case OSiOS.DEVICE_IPOD:
		{
			trace("iPod touch です")
			break;
		}
		case OSiOS.DEVICE_IPHONE:
		{
			trace("iPhone です")
			break;
		}
		case OSiOS.DEVICE_IPAD:
		{
			trace("iPad です")
			break;
		}
	}
	
	trace("CUP世代:");
	switch(OSiOS.generation())
	{
		case OSiOS.GENERATION_0:
		{
			trace("iPhone3Gsなど含む古い機種です")
			break;
		}
		case OSiOS.GENERATION_1:
		{
			trace("iPhone4など含む古いsingle coreな機種です")
			break;
		}
		case OSiOS.GENERATION_2:
		{
			trace("iPhone4sなど含むdual coreな機種です")
			break;
		}
		case OSiOS.GENERATION_3:
		{
			trace("iPad 3rdなど含むdual coreな機種です")
			break;
		}
		case OSiOS.GENERATION_4:
		{
			trace("iPhone5 など含むdual coreな機種です")
			break;
		}
		case OSiOS.GENERATION_5:
		{
			trace("iPad 4thなど含むdual coreな機種です")
			break;
		}
		case OSiOS.GENERATION_NEWER:
		{
			trace("判定不可(未発売)な最新機種のようです")
			break;
		}
	}
	
}

generation値はNumberなので、定数定義を使って以上以下判定して使えます。
シュミレーター実行の場合のみ、画面サイズをつかって type,generation 判定しています。
generationにおいて、判定不可なものは、”未発売の新しいもの” として分類されます。