Titaniumが生成したObjective-Cのコードを修正する

禁断の技に手を染めてみたメモ。
しかしながらこの技は相当の技術的負債をともなうため、非推奨。

修正対象のコードのある場所

一度でもアプリをビルドするとproject_dir/build/iphone/Classes以下にTitaniumが生成したObjectiv-Cのコードが展開されるので、これを修正する。
修正されるとちゃんと反映されるのでちょっと面白い。

ただ全てのソースコードの頭のコメントにはもれなく次のような警告が含まれている。

 * WARNING: This is generated code. Modify at your own risk and without support.

リスク

Titaniumが生成したObjective-Cのコードを修正することにはリスクがある。
ちょっと考えただけでもいろいろな面倒の可能性が思いつく。

  • 修正したコードにバグを埋め込んでしまう
  • クリーンビルドしたときに修正したコードを上書きしてしまい不具合の原因になる
  • 修正によって他のコードとの整合性が不十分になりバグを生んでしまう
  • Titaniumのバージョンアップで動かなくなる

個人的にはbuild以下はバージョン管理の対象から外しているのと、何かの拍子にアプリがビルドできなくなった場合などにざっくり削除することがままあるので、ファイルのバックアップを他に取っておかねばならない。この点でも運用に複雑度が増すので微妙な感じになる。

モジュールを作って使おう

幸いそうしたリスクを取らなくてもすむリーズナブルな解決方法が用意されている。
Titaniumの機能を拡張するモジュールを作ることだ。

Objective-Cが理解できる人にとってはTitaniumのモジュール作成はかなり簡単で、手順さえ間違わなければすぐにできる。
既存のAPIクラスを継承して拡張することもできるため、標準のAPIでちょっとだけ物足りない箇所を補ったりすることも可能。

Titanium標準のAPIも同様のやり方で実装されているので、標準のAPIでできることは全てできると思って間違いないと思う。

余談

今までJavaScriptのコードがObjective-Cのコードに変換されるのかと思っていたが、今回の技を試すのとモジュールを作ってみた過程で、Proxyオブジェクトを通してJavaSciptの記述をアプリケーションに反映するものだと分かった。
ひとつ賢くなった。