2012年5月14日月曜日

iOSデバイス間の互換性まとめ

iOSは既に数種類の端末が出ており、もちろん今後も出ることが期待されています。アプリの開発者としてはできる限り多くの人・端末で使って欲しいところですが、特定の機能を使わなければならないこともあります。そこで、iOSデバイスでの互換性について記述します。

デバイスと対応するOSの対応表

各デバイスの対応OS(2012/05/13現在) ※斜体はサポート終了
デバイス初期OS最終OS
iPod touch (第1世代)iPhone OS 1.1iPhone OS 3.1.3
iPod touch (第2世代)iPhone OS 2.2iOS 4.2.1
iPod touch (第3世代)iPhone OS 3.1iOS 5.1.1(現在)
iPod touch (第4世代)iOS 4.1/iOS 5iOS 5.1.1(現在)
iPhone (初代)iPhone OS 1.0iPhone iOS 3.1.3
iPhone 3GiPhone OS 2.0iOS 4.2.1
iPhone 3GSiPhone OS 3.0iOS 5.1.1(現在)
iPhone 4iOS 4iOS 5.1.1(現在)
iPhone 4SiOS 5iOS 5.1.1(現在)
iPadiPhone OS 3.2iOS 5.1.1(現在)
iPad 2iOS 4.3iOS 5.1.1(現在)
新しいiPadiOS 5.1iOS 5.1.1(現在)

OS別に分けた場合の対応デバイス(2012/05/13現在) ※斜体はサポート終了
対応のOSデバイス
iPhone OS 3.1.3まで
【3.2以降は非対応】
iPhone (初代)
iPod touch (第1世代)
iOS 4.2.1まで
【4.3以降は非対応】
iPhone 3G
iPod touch (第2世代)
iOS 5.1.1まで(現在)iPod touch (第3世代), iPod touch (第4世代)
iPhone 3G, iPhone 4, iPhone 4S
iPad, iPad2, 新しいiPad


UIRequiredDeviceCapabilitiesの値

iOS 3.0以降では、作成したアプリがどのような機能を使うのかということを「<project_name>-Info.plist」に必ず書かなければなりません。この値は、ユーザがApp Storeから誤ってダウンロードしないようにするためのものでもあります。そのため、条件をきつくすると本来ならば使えるデバイスで使えなくなってしまいますし、緩すぎるとアプリが正常に動作しなくなってしまいます。その機能が無くてもアプリケーションが動作する場合には記入すべきではありません。以下、記入することのできるキーとその説明です。
詳細は、以下のドキュメントに書かれています。

    iPod touchiPhoneiPad
    第1世代第2世代第3世代第4世代初代3G3GS3GS 中国版44SWi-FiWi-Fi+3G2 Wi-Fi2 Wi-Fi+3G新しい Wi-Fi新しい Wi-Fi+Cellular
    armv6
    ARMv6に対応する(iOS 3.1以降)。iOSアプリケーション プログラミングガイド()の「浮動小数点演算の留意点(Floating-Point Math Considerations)」も参照。
    armv7----
    ARMv7に対応する(iOS 3.1以降)。同上。
    telephony----------
    電話アプリを利用する。
    sms----------
    メッセージ(Message,iMessage)アプリを利用する。
    wifi-
    Wi-Fiを利用する。
    peer-peer--
    Bluetoothを利用する(iOS 3.1以降)。
    bluetooth-le-------------
    Bluetooth low energy(Blutooth v4.0)を利用する(iOS 5.0以降)。
    still-camera-----
    カメラを利用する。
    front-facing-camera---------
    フロントカメラを利用する。
    auto-focus-camera----------
    オートフォーカス(マクロ撮影)を利用する。
    camera-flash--------------
    カメラのLEDフラッシュを利用する。
    video-camera-------
    ビデオ撮影を利用する。
    microphone-
    内蔵マイクを利用する
    accelerometer
    加速度センサーを利用する。
    gyroscope---------
    3軸ジャイロを利用する。
    magnetometer------
    デジタルコンパスを利用する。
    gps--------
    GPS(もしくはAssisted GPS)を利用する。同時にlocation-servicesも併記必須。
    location-services
    現在地を利用する。GPSを利用しない場合はこれだけで良い。
    gamekit---
    Game Centerを利用する(iOS 4.1以降)。
    opengles-1
    OpenGLES 1.1を利用する。
    opengles-2----
    OpenGLES 2.0を利用する。

    第1世代第2世代第3世代第4世代初代3G3GS3GS 中国版44SWi-FiWi-Fi+3G2 Wi-Fi2 Wi-Fi+3G新しい Wi-Fi新しい Wi-Fi+Cellular
    iPod touchiPhoneiPad
    Multitasking----
    マルチタスクが可能である。
    Retina-----------
    Retinaディスプレイ搭載機である。
    下の方には、直接UIRequiredDeviceCapabilitiesとは関係ありませんが、デバイス間の比較のために「マルチタスク」「Retinaディスプレイ」を追記してあります。


    画面サイズ


    デバイス
    (ピクセル)

    (ピクセル)
    アスペクト比
    iPod touch(第1世代)
    480
    320
    3:2
    iPod touch(第2世代)
    iPod touch(第3世代)
    iPhone (初代)
    iPhone 3G
    iPhone 3GS
    iPod touch(第4世代)
    960
    640
    iPhone 4
    iPhone 4S
    iPad (初代)
    1024
    768
    4:3
    iPad 2
    新しいiPad
    2048
    1536


    現在のiOSの割り合いについて

    そら案内 for iOS のアクセス解析結果に見るiOSの世界 | 関西/大阪のiPhone・iPadアプリ開発 feedtailor Inc. 社長ブログにあるように、アクセスされているiOSの割り合いを公開されているところもあります。非常にありがたいです。
    どんなOSでも当てはまりますが、公式のサポートが切れても使い続ける方は一定数おり、その割り合いが多い場合は動作検証した方が良い場合もあると思います。例えば、iPhone 3Gの場合重いからという理由でiOS 3.xを使っているかたも多いはずです。

    現状、多くのアプリの場合はiOS 4.3以上【iPod touch(第2世代), iPhone 3Gは対象外】としていることが多いように感じています。

    なお、以前SoftBankから公式に出された情報では、
    この度、ソフトバンクモバイルは、お客さまにより快適なモバイル環境をご提供するにあたり、音声ネットワークの最適化を2011年11月以降に実施いたします。 それに伴い、ご利用中のソフトウェアがiOS 4.2以降でない場合、一部音声品質に影響が出る可能性がございます。 iPhoneをコンピュータに接続し、iTunesをご利用の上、最新のソフトウェアへのアップデートをお願いします。
    となっており、3GSの場合でも多くはiOS 5以上にしているのではないかと(好意的に)思っています。

    しかし、iOS 5よりも前のデバイスは「PC FREE」ではないためアップデートしたくても分からない・できないという方もいるはずで、iOS 5以上しか対応しないというのでなければ、まだ数年はiOS 4.x(3Gを含めない場合はiOS 4.3)以上を対象にすることになると考えています。


    互換性を保つソースコードの書き方

    特定のバージョンのiOSの機能を利用する (iOS 2.0以降)

    ・コンパイル時に判定する方法
    以下の「Availability.h」「AvailabilityInternal.h」に定義されているマクロを利用します。
    - Availability.h
    #define __IPHONE_2_0     20000
    #define __IPHONE_2_1     20100
    #define __IPHONE_2_2     20200
    #define __IPHONE_3_0     30000
    #define __IPHONE_3_1     30100
    #define __IPHONE_3_2     30200
    #define __IPHONE_4_0     40000
    #define __IPHONE_4_1     40100
    #define __IPHONE_4_2     40200
    #define __IPHONE_4_3     40300
    #define __IPHONE_5_0     50000
    #define __IPHONE_5_1     50100
    #define __IPHONE_NA      99999  /* not available */
    
    - AvailabilityInternal.h
    __IPHONE_OS_VERSION_MIN_REQUIRED
    __IPHONE_OS_VERSION_MAX_ALLOWED
    

    「__IPHONE_OS_VERSION_MIN_REQUIRED」はターゲットの「Deployment Target」の値で変化します。

    if __IPHONE_OS_VERSION_MIN_REQUIRED >= 50000
        // iOS 5.0以上の処理
    else
        // iOS 5.0未満(iOS 4.3以下)の処理
    endif
    
    「__IPHONE_5_0」などのマクロも、もちろん利用できるが、Availability.hのコメントにも書かれている通り、古いSDKにはそのマクロが定義されていないので、「0」とみなされてしまう。そのため、以下の様なことになります。
    if __IPHONE_OS_VERSION_MIN_REQUIRED >= 0  // __IPHONE_5_0と書いたはずが、、、
        // iOS 5.0以上の処理のはずが、常にコンパイルされる
    endif
    

    ・実行時に判定する方法
    float version = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (version >= 5.0) {
        // iOS 5.0以上の処理
    }


    メソッドの有無を確認

    if ([CLLocationManager respondsToSelector:@selector(locationServicesEnabled)]) {
        if (![CLLocationManager locationServicesEnabled]) {  // iOS 4.0以降はクラスメソッド
            // 何らかの処理
        }
    } else {
        if (!locationManager.locationServicesEnabled) {  // iOS 3.xはプロパティ
            // 何らかの処理
        }
    }

    0 コメント:

    コメントを投稿