2013-10-17

古いiOSデバイス用アプリ開発

iOS 7が登場し、スマートフォンのCPUも64ビット化されようかという今、そう、いまだから、いまさら役に立たない第1世代 iPod touch(iOS 3.1.3) 対応アプリ開発法を忘れないうちにメモ。 ひとことでまとめると、

OS X Mountain Lion 10.8.5 + Xcode 4.4.1を使えば開発可能

である(※古い iPhone SDK と Device Support を追加しておくこと)。

ただし、Xcode 4.4.1標準のプロジェクトテンプレートから生成されるプロジェクトを、そのままビルドしただけでは iPhone 3G/iPod touch 1st generation のような旧式デバイスで動くアプリは作れない。注意すべきポイントがいくつかある。

  1. プロジェクトの iOS Deployment Target を 3.1 にする。
  2. プロジェクトの Build Settings > Architectures > Architectures に armv6 を追加する。
  3. プロジェクトの Build Settings > Build Options > Comiler for C/C++/Objective-C を LLVM GCC 4.2 にする。
  4. ARCやBlocks(ブロック構文)はもちろん、iOS 3でサポートされない機能(iOS 4以降で拡張されたような)を使わないようにする。
iOS Deployment Target

Xcodeのいくつかのバージョンと、それに対応するiOS Deployment Targetの範囲(Deployment Targetの選択肢としてプルダウンメニューに表示されるiOSバージョン)を調べてみると次のようになっている。

Xcode 3.2.2iPhone OS 2.0 〜 3.2
Xcode 3.2.3iPhone OS 2.0 〜 4.0
Xcode 4.1iOS 3.0 〜 4.3
Xcode 4.2.1iOS 3.0 〜 5.0
Xcode 4.3.3iOS 3.0 〜 5.1
Xcode 4.4.1iOS 3.0 〜 5.1
Xcode 4.5.2iOS 4.3 〜 6.0
Xcode 4.6.3iOS 4.3 〜 6.1
Xcode 5.0iOS 4.3 〜 7.0

Xcodeを動作させるOS Xの条件は次の通り。

  • Xcode 3系はLion 10.7と互換性がない。Snow Leopard 10.6.8対応
  • Xcode 4.1からLion対応
  • Xcode 4.4からMountain Lion 10.8対応
  • Xcode 5.0はMountain Lion用
アーキテクチャー

いまどきのXcodeではarmv6のような古いCPUは、デフォルトでは相手にされていないので、

Xcode cannot run using the selected device.
Choose a destination with a supported architecture in order to run on this device.

と言われ、実行できない。

コンパイラ

デフォルトの Apple LLVM compiler 4.0 のままだとlibSystem.B.dylibがRequired(strong link)になっているため、実行すると、

dyld: Symbol not found: __NSConcreteGlobalBlock
  Referenced from: /var/mobile/Applications/3DC90EC5-264E-44A5-93A0-87201A3EC9A9/Hoge.app/Hoge
  Expected in: /usr/lib/libSystem.B.dylib
 in /var/mobile/Applications/3DC90EC5-264E-44A5-93A0-87201A3EC9A9/Hoge.app/Hoge

のようにクラッシュする。GCCにすればデフォルトでOptional(weak link)となる。

サポートされない機能

Xcode 4.4.1標準のプロジェクトテンプレートから生成されるプロジェクトには、UIWindowのrootViewControllerプロパティに代入を行うコードがあるが、このプロパティはiOS 4で追加されたものなのでiOS 3ではエラーとなる。

Objective-C言語・ランタイムのバージョンが異なるので注意が必要である。

  • ARCやBlocksは使えない。
  • プロパティに対応するインスタンス変数の宣言は省略できない(自動的に合成されない)。

Xcode 3.2.2(& iPhone SDK 3.2)があれば、レガシーなiOS,Objective-C向けのプロジェクトを作成できるので、そいつを流用するとあまり悩まなくて済む。

0 件のコメント:

コメントを投稿