[ライフハック] アプリがサポートするiOSバージョン、デバイスの範囲の辺りのつけ方について

下限から妥協していく

結論から言うと手持ちのデバイスのうち一番古いモデルと、そのデバイスがサポートされている一番古いiOSバージョンに決める

iOS

OSから決めるのがベネ

Xcode/iOS SDKのバージョンによって対象にできるバージョンが違う。

Xcode4.6 / iOS SDK 6.1
iOS4.3以上
Xcode4.5 / iOS SDK 6.0
iOS4.3以上
Xcode4.4 / iOS SDK 5.1
iOS3.0以上

今からiOS3系をサポートしたい強い動機や鋼の意思、巨万の富などがあるならSDK5.1からスタート(iOS3サポートがどの程度現実的かというと試しにあなたの手元のプロジェクトをSDK 5.1で3.0に設定してビルドしてみればいい。俺は実機デバッグすら動かなかった)。
なければ最新のSDKで下限のiOSバージョン以上を対象にはじめる(現在は SDK 6.1 / 4.3)。

Xcode 4.3以前はMountain Lionに入らないから検証できなかった。

過去バージョンは以下からダウンロードできる。
https://developer.apple.com/downloads/index.action?name=Xcode

iOSシミュレータ

iOSシミュレータはXcode4を使用する限りiOS5.0以上しか提供されていない。よってiOS3.0〜4.3のテストをする場合はデバイスが必要。

iOS4.3以下が入ったデバイスがない場合、かつそれがネックになった時点であれこれ判断して「iOS5.0以上をサポート」に上げる。
またiOS5.0以上であっても実機でのみしかテストできない範囲もあるので、手持ちデバイスによって同じルールを適用する。

開発環境機能

最低でも

  • ARC
  • Storyboard
  • 弱い参照
  • Objective-Cイディオム
  • その他のデフォルトの挙動

あたりが開発環境のバージョンの違いによって差異が出る。最新を使うことをおすすめする。
あと、業務で他人に渡すコードは最新だけで意図どうり動く書き方はなるべくしない。

iOS新機能

iOSバージョンx時点で追加されたAPIを使うことが必須なアプリは以下を検討する

  • iOSx以上はデフォルトAPIを使い、以下は代替APIを補助するライブラリを使用する
  • iOSx以上のみを判定し、UIを変えてユーザーから見た機能を増やす

しない場合はおのずとその対象バージョンにする

デバイス

Appleがサポートしてない範囲は除く。

Apple セキュリティアップデートなどで今現在iOSアップデートにどのデバイスがサポートされているのかわかる
iOS 6.1.3でいうとこんなかんじ

対象となるデバイス:iPhone 3GS 以降、iPod touch (4th generation) 以降、iPad 2 以降

iOS 5.1.1時点ではこうだった

対象となるデバイス:iPhone 3GSiPhone 4iPhone 4SiPod touch (3rd generation) 以降、iPadiPad 2

iOS 4.3.5

対象となるバージョン:iPhone 3GS および iPhone 4 (GSM モデル):iOS 3.0 〜 4.3.4、iPod touch (3rd generation) 以降:iOS 3.1 〜 4.3.4、iPadiOS 3.2 〜 4.3.4

iOS 4.3を下限にした場合、デバイスはiPhone 3GSが妥当だというのがわかる

テスト環境

iPhone 3GSiPod Touch 3rdにiOS4.3が入ったデバイスをメインで使うのがベスト。
開発マシンではiOS5.0シミュレータでのデバッグを行う。

古い端末をユーザーテストに使う利点としてはパフォーマンス上の問題を早期発見できる。「早すぎる最適化」という話でもなく、別にその時点で修正を行わないとしてもパフォーマンス上の問題が出る方向に向かっているのさえ認識していればOK。次に設計するコンポーネントの時に再考したりもできる。また開発環境というのは往々にしてクリーンな状態から行うものなので古い端末のユーザーでなくても、使い続けてデータが蓄積したらここはどうなるのかというストレステストへの発想にもなる。

現実の問題

  • iOSx.x以前のみうまく動かない機能が発生したけど原因がよくわからん
  • 時間や金や生命力がなくなってきた
  • 途中で変更できなく契約時点でバージョン決めなきゃいけない

などの都合で変わるのでがんばってください。