読者です 読者をやめる 読者になる 読者になる

imthinker::net

ふらふらうぇぶろぐ

Titanium 3.2 の本筋から微妙にずれた話

Titanium Mobile Objective-C Titanium Studio Alloy JavaScript

Titanium™ Advent Calendar 24 日目の記事です。 23 日目は Taka SaMa さんのTitanium 活況!の件についてでした。

先日、いよいよ Titanium 3.2 がリリースされました。 Titanium 3.2 は iOS 7 対応の強化や iOS 7.1 beta 対応、 Android 4.4 KitKat 対応など、新しいプラットフォームへの対応が進められただけでなく、 Ti.UI.TableView よりもハイパフォーマンスな Ti.UI.ListView の API 強化や、コマンドラインインターフェースである Titanium CLI も強化され、直接 iOS デバイスにビルドしたアプリをインストールできたり、超高速な Android エミュレータである Genymotion と連携できるようになったりと、 Titanium 3.1 から 0.1 のアップデートとは思えないほど、大きく改良されています。

私個人としては、 Titanium 3.2 は Titanium 3.5 または Titanium 4.0 と読んでも差し支えないほどと思っていますが、 Appcelerator 的には Ti.Next を 4.0 にしてくるのでしょうか。そんな Titanium 3.2 の本筋とは微妙に外れた、周辺ツールのバージョンアップについて紹介しましょう。

細かい話

Titanium 3.2 自体の変更点に関してはリリースノートを見ていくのが一番です。こちらを見ていただければ分かるように、 0.1 のアップデートとは思えないほど、長いリリースノートが書かれています。

Alloy 1.3.0

公式 MVC フレームワークである Alloy も同時のアップデートされました。注意としては、 Alloy 1.3.0 は Titanium 3.2 以降専用ということです。 Titanium 3.1.x 系の SDK と Alloy を使ってアプリを作っている場合、 Alloy だけを 1.3.0 にすることはできません。

Alloy 1.3.0 の詳しい変更点は GitHub のチェンジログを読むのが早いでしょう。 XML のマークアップが強化されていて、 ListView であれば Titanium 3.2 から使えるようになった HeaderViewFooterView タグに対応したり、 SearchBar または Android 用の SearchView に対応しています。

ListView API は Titanium Classic スタイルで書くととても複雑で長いコードになりがちですが、 Alloy の XML マークアップで記述すると分かりやすく、見通しの良い管理ができるので Alloy 側の対応が強化された点は素直に喜ばしいことです。

<Alloy>
  <Window title="Alloy ListView">
    <ListView id="listview" filterAttribute="title">
      <!-- ヘッダービュー -->
      <HeaderView>
        <Label backgroundColor="#333333" color="#FFFFFF" text="HeaderView" />
      </HeaderView>

      <!-- フッタービュー -->
      <FooterView>
        <Label backgroundColor="#333333" color="#FFFFFF" text="FooterView" />
      </FooterView>

      <!-- サーチ -->
      <SearchBar platform="ios" />
      <SearchView ns="Ti.UI.Android" platform="android" color="#FFFFFF" />

      <!-- 実際の表示 -->
      <ListSection headerTitle="ヘッダ・セクション1">
        <ListItem title="こんにちは" searchableText="こんにちは" />
        <ListItem title="こんばんは" searchableText="こんばんは" />
        <ListItem title="さようなら" searchableText="さようなら" />
      </ListSection>
    </ListView>
  </Window>
</Alloy>

Titanium Studio

Titanium 3.2 が出たので、 Titanium Studio も 3.2.0 が出ています。そして、 Accelerator のサイトにログインした先には罠が待ち構えています。

f:id:RyuGoo:20131224011610p:plain

これは罠ですね。早く直ると良いのですが。 OS X Mountain Lion を使っていようが、 OS X Mavericks を使っていようが、 Mac 10.8 と書かれたリンクをクリックして Titanium Studio 3.2.0 をダウンロードしてください。隣の Mac 10.9 (RC) は罠です。 Titanium Studio 3.2.0 自体は Eclipse 4.3 ベースになってシンプルなインターフェースになりました。詳しくはガイドの Studio 3.2.0 Changes をご覧ください。

Titanium CLI

iOS デバイスの実機転送

Titanium CLI は iOS の場合、実機に直接インストールすることができるようになりました。これまでは iTunes や Xcode を経由したり、先行で公開されていた node-ios-device を使ってデバイスにインストールすることができましたが、これからはビルドすればそのままデバイスにインストールできます。問題は、 Provisioning Profile の ID を知る方法が、意外とどこにもアナウンスされていないという点でしょうか。これも Titanium CLI を使うと知ることができます。

あまり使われていないであろうコマンド、 titanium info を使います。すると、 Titanium SDK のインストール状況や Android SDK のバージョン情報など Titanium を使わないでも役立ちそうな情報が色々と表示されるのですが、その中に

  • Development iOS Provisioning Profiles
  • Distribution iOS Provisioning Profiles
  • Ad Hoc iOS Provisioning Profiles

の項目があり、それぞれに Provisioning Profile の UUID や対応する App ID が表示されます。

f:id:RyuGoo:20131224011444p:plain

iOS デバイスを接続していれば、 Connected iOS Devices という項目があり、こちらでデバイスの UUID を知ることもできます。

f:id:RyuGoo:20131224011452p:plain

これらの項目から Provisioning Profile の UUID とデバイスの ID をメモしておき、開発中のアプリを実機に転送してデバッグするには、

titanium build -p ios -T device -C <デバイスの ID> [-V "<開発者名>" -P <Provisioning Profile の UUID>]

で対応します。開発者名に関しても titanium info

  • iOS Development Certificates
  • iOS Distribution Certificates

の項目に表示される名前が対応するので、必要に応じて入力してください。

Genymotion を有効にする

Genymotion を使う場合も Titanium CLI にオプションを追加しておく必要があります。 Titanium CLI は 3.2.0 からウィザード形式のセットアップが可能になったのですが、ここから Genymotion 対応を有効にすることはできません。 Genymotion を使う場合は

titanium config genymotion.enabled true

で対応します。 Titanium Studio を使う場合でもこちらが必要です。また、このオプションを有効にした状態で Genymotion 上に仮想 Android デバイスをインストールしていれば titanium info で現れる項目に、 Genymotion Emulators が表示されます。

f:id:RyuGoo:20131224011335p:plain

この項目にインストール済みの仮想 Android デバイスが表示されていれば、 Genymotion エミュレータを起動中に

titanium build -p android

で転送できます。アプリもそのまま起動し、ログもターミナルにそのまま表示されるので、非常に開発が捗ります。ちなみに、私の環境では2つの仮想 Android デバイスを立ち上げていると、後に立ち上げた方に転送されました。このあたりの挙動は良くわかりません。もしも特定の環境にインストールしたいということであれば、

% adb devices                                                                                   
List of devices attached
192.168.56.102:5555 device
192.168.56.103:5555 device

で表示されるデバイスを確認した後 (adb へのパスは予め通しておいてください) 、

titanium build -p android -b && adb -s 192.168.56.102:5555 install -r build/android/bin/<アプリ名>.apk

でデバイスを指定してインストールできます (この場合はアプリは自動起動しません) 。アプリ名は基本的にプロジェクト名が対応します。 Titanium 3.1 までは app.apk で名前が統一されていましたが、 Titanium 3.2 からはアプリ固有の名前が付くようになりました。

iOS 向けのネイティブモジュール

iOS 向けのネイティブモジュールで Auto Reference Count (ARC) が使えるようになりました。これまでのモジュール開発は RELEASE_TO_NIL など、 Titanium SDK が提供するマクロを使って自分でメモリ管理を行う必要がありましたが、 ARC が使えるようになったことで、コンパイラにそれらを任せることができるようになりました。 GitHub などで提供されている iOS 向けのライブラリは iOS 5 の時点で ARC 対応が進められていて、ほとんどが ARC 前提だったので、 Titanium 3.2 からはこれらをラップしたモジュールが作りやすくなったということです。

モジュール作成にも Titanium CLI を使いたいところなのですが、どうも Titanium CLI のモジュールテンプレートは変なプロジェクトをはき出してしまうので、 SDK 同梱の titanium.py を叩く方が確実です。

~/Library/Application\ Support/Titanium/mobilesdk/osx/3.2.0.GA/titanium.py create \
--platform=iphone \
--type=module \
--dir=<モジュールプロジェクトを設置するディレクトリ> \
--name=<モジュールの名前> \
--id=<ドメインを逆順にした ID>

プロジェクトディレクトリを覗くと、 Xcode のプロジェクトファイルがあるので、これを Xcode で開きます。

f:id:RyuGoo:20131224011510p:plain

実は Titanium 3.2 でモジュールに ARC が使えるようになったからといって、プロジェクトのデフォルトが ARC 対応したわけではありません。明示的に ARC を使うと宣言しなくてはなりません。以下の3ステップが必要です。

ARC を使うフラグを有効にする

f:id:RyuGoo:20131224011354p:plain

  1. プロジェクトを選択
  2. Build Settings を選択
  3. All を選択
  4. 検索バーに auto と入力
  5. Objective-C Automatic Reference Counting を Yes にする
iOS Deployment Target を 6.0 にする

f:id:RyuGoo:20131224011411p:plain

  1. プロジェクトを選択
  2. info を選択
  3. iOS Deployment Target を 6.0 にする
[super dealloc] をコメントアウトする

f:id:RyuGoo:20131224011426p:plain

  1. プロジェクトプレフィックス + Module.m ファイルを開く
  2. Xcode がエラーを出力しているはずなので、 [super dealloc]; をコメントアウトする

これで Titanium Module プロジェクトを ARC 対応させることができました。あとは GitHub などにある素晴らしいライブラリをどんどんラッピングしていきましょう (もちろん、ライブラリのライセンスに従ってください) 。