2011/09/04

iOS SDK関連の Titanium Mobile iOS の設定


Xcode プロジェクトの設定は、デフォルトのまま使うのでない限り、設定がとても面倒です。Ti はこの辺りを簡略化して、間違いないように設定してくれているともいえますが、過剰に簡略化されてしまっているため、いろいろ不便なことが起こってきます。
困っている点は、Xcode プロジェクトの iOS Deployment Target にあたる設定が固定になっている点です。


iOS SDK とターゲット関連の設定は、概念的に次のような区別があります

  • Architectures
  • Valid Architectures
  • Supported Platforms
  • Base SDK
  • iOS Deployment Target
  • Target Device (Family)
  • シミュレータのバージョン

Architectures (ARCHS) と Valid Architectures (VALID_ARCHS)
アーキテクチャはターゲットの CPU のタイプを指定する設定項目です。armv6, armv7, i386などの値を設定します。Ti では、
ARCHS = armv6 armv7
VALID_ARCHS = armv6 armv7 i386
という値で、固定になっています。
ビルドされたアプリのアプリケーションバンドル内の exec ファイルを nm コマンドなどでチェックすると、どのアーキテクチャが含まれるか確認できます。
iPhone4専用のアプリしたい、少しでもアプリサイズを削減したいなどの理由で、この値も変えたいところですが、現状のTiではできないことになっています。


Supported Platforms
実機用とシミュレータ用のターゲットを作る設定です。
iphoneos iphonesimulatorという値で固定になっています。これは、変更すべき用途は特に見当たりません。


Base SDK (sdk) と iOS Deployment Target (IPHONEOS_DEPLOYMENT_TARGET)
iOS の開発環境の思想として、新しい iOS 用の SDK がそれ以前の iOS をもサポートするという原則があります。例えば、iOS4.x SDK はそれ以前の 3.x で動作するアプリの開発が可能です。このときの新しい SDK にあたるのが Base SDK で、それ以前の iOS にあたるのが iOS Deployment Target です。Apple はなるべく新しい SDK でアプリを開発することを推奨していますし、おおむね新しい SDK の方が安定しています。
そんな背景から、Titanium のビルドシステムでは、開発環境で最も新しい SDK を自動的に選択して使用するようになっています( build.py のなかで行われます)。そして、iPhone あるいはユニバーサルアプリをターゲットとする場合、iOS Deployment Target として iOS3.1 が選択されます。それ以外の iPad がターゲットの場合には iOS3.2 が選択されます。これらの選択は固定的に行われるため、変更することができません。
iOS Deployment Target は、ビルドされたアプリのアプリケーションバンドル内の info.plistの MinimumOSVersion に反映されます。


以下のログは、deploy > distribute ios app で配布用のアプリを作成する際 SDK で 3.2 を選択した場合のログの抜粋ですが、3.2 を指定したにもかかわらず、開発環境中の最も新しいSDKである 4.3 が自動的に選択された様子を示しています。

Script arguments:
    /Library/Application Support/Titanium/mobilesdk/osx/1.7.2/iphone/builder.py
    distribute
    3.2
    /Users/hogehoge/Documents/Titanium Studio Workspace/TestBuildSetting
    com.hoge.testbuildsetting
    TestBuildSetting
    AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAA
    hogehoge
    /Users/hogehoge/Downloads
    universal
    ..................
Starting Xcode compile with the following arguments:

    xcodebuild
     -target
    TestBuildSetting-universal
    -configuration
    Release
    -sdk
    iphoneos4.3
    CODE_SIGN_ENTITLEMENTS=Resources/Entitlements.plist
    GCC_PREPROCESSOR_DEFINITIONS=DEPLOYTYPE=production TI_PRODUCTION=1
    PROVISIONING_PROFILE=AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAA
    CODE_SIGN_IDENTITY=iPhone Distribution: hogehoge
    DEPLOYMENT_POSTPROCESSING=YES
    IPHONEOS_DEPLOYMENT_TARGET=3.1
    TARGETED_DEVICE_FAMILY=1,2
    VALID_ARCHS=armv6 armv7 i386
Target Device Family (TARGETED_DEVICE_FAMILY)
iPhone専用(1)、iPad専用(2)、ユニバーサルアプリ(1,2)のターゲットを指定する設定項目です。例えばユニバーサルアプリの場合には
TARGETED_DEVICE_FAMILY=1,2
のように設定されます。
ビルドされたアプリのアプリケーションバンドル内の info.plist の UIDeviceFamily に値が反映されます。
Ti では、プロジェクトの作成時に指定します。後から、tiapp.xml で変更できますが、挙動が少々バギーです。


シミュレータのバージョン
これは、ビルドの設定というより、テスト時の実行環境の選択になるのですが、Xcode の場合、選択できる範囲が iOS Deployment Target つまり MinimumOSVersion の値に依存して変化します。TiStudio の場合 iOS Deployment Target が固定値になっているので、ビルド環境で選択できるすべてのシミュレータのバージョンが Run Configurations あるいは Debug Configurations の SDK の選択メニューで選択できます。ただし、Xcode3.2.x 以降の環境では、3.1.x のシミュレータがないため 3.1.x を選択できません。さらにTiは、Xcode3.1.x の環境ではビルドできないため、結論として、3.1.x 以前のバージョンのシミュレータで試すことができません(3.2.x 以降の Xcode から、工夫して 3.1.x 系のシミュレータを使えるようにすることは可能のようですが、導入が 若干面倒です)。


さて、最初にあげた問題点は、iOS の API によっては、iOS の実行時のバージョンによって使えたり、使えなかったりするため、iOS Deployment Target を指定して、APIの存在するiOS のみに限定したいというものでした。Ti 本体でも事情は同じで、例えば、iOS 4.0 以上にしか存在しない iAd,  CoreVideo,  CoreMedia などのフレームワークは、weak_framework して、実行時に API が使えるかチェックするように実装されています(と思って確認したら、そうなってないよw)。


参考文献
SDKCompatibility Guide
Xcode Build Setting Reference
Titanium Compatibility Matrix

0 件のコメント:

コメントを投稿