Titaniumのモジュール作成にチャレンジ
MapViewのアノテーション表示処理をカスタムしたくてモジュール作りに走ってみた。
参考リソース
日本語リソースとしては以下のページがとても参考になる。
- [Titanium] Titanium Module Development メモ – その1 – それはBlog
- [Titanium] Titanium Module Development メモ – その2 – それはBlog
チュートリアルとして見るとモジュールの設置やtiapp.xmlの編集が抜けていたりするけれども、全体的にスクリーンショット入りでわかりやすくまとまっていてGJなかんじです。
後は本家のPDFを見るべし。
モジュールの作成
モジュールはアプリケーションとは別のプロジェクトとして作成する。
準備
$ alias /Library/Application\ Support/Titanium/mobilesdk/osx/1.5.1/titanium.py titanium
titanium.pyを使いやすくするためにエイリアスをはる。
.zshrcにも書いておく。
都度フルパスでタイプする心意気があればこのステップは不要。
2011/07/29追記
パスが「/Library/〜」ではなく「$HOME/Library/」のこともあるので注意。
プロジェクトを作成する
titanium.pyの引数にplatformやtypeやらを指定してプロジェクトを作成。
nameはプロジェクト名でidがモジュール名になる。
$ cd ~/works/titanium/modules $ titanium create --platform=iphone --type=module --name=MyMapView --id=to.brass
プロジェクトができたのでそのディレクトリに移動しとく。
idがモジュール名になる。大事なことなので二回言いました。
$ cd MyMapView # ~/works/titanium/modules/MyMapView
この時点でもうモジュールを実行して動作確認できるようになっているがそれははしょる。
ToBrassMyMapViewの作成
XCodeでプロジェクトを開いてTiUIViewのテンプレートでファイルを追加する。
とりあえずTiMapViewを単に継承してみようということで生成されたファイルのヘッダファイルのみ修正。
#import "TiUIView.h" #import "TiMapView.h" // この行追加 @interface ToBrassMyMapView : TiMapView { // この行修正 @private } @end
クラス名に注意点がありToBrassはプリフィックスとして必要。プロジェクト作成時に指定したidを用いる。
Viewはサフィックスとして必要。
ToBrassMyMapViewProxyの作成
同様にTiViewProxyテンプレートでMyMapViewProxyも作成する。
こちらもヘッダファイルのみ修正。
#import "TiViewProxy.h" #import "TiMapViewProxy.h" // この行追加 @interface ToBrassMyMapViewProxy : TiMapViewProxy { // この行修正 @private } @end
こちらもやはりクラス名に規約がある。
ViewProxyがサフィックス。
ビルドする
./build.py
ログがざっと流れた後BUILD SUCCESSと出たらオッケー。
to-brass-iphone-0.1.zipというファイルができている。
設置する
cp to.brass-iphone-0.1.zip /Library/Application\ Support/Titanium/
/Library/Application\ Support/Titanium/にzipを置いておけばビルド時に自動で展開される。
展開後zipは削除される。
2011/07/29追記
ここでもパスが「/Library/〜」ではなく「$HOME/Library/」のことがあるので注意。
またプロジェクトのディレクトリの直下に置いてもOK。
その場合はそのプロジェクトでだけそのモジュールが使えるようになる。
モジュールの利用
モジュールをアプリに組み込んでみる。
tiapp.xmlの編集
モジュールのidとversionを指定して読み込む準備をする
アプリのプロジェクトディレクトリのtiapp.xmlのmodulesの部分を修正する。
to.brass
JavaScriptのコードの編集
コード内でrequireを利用してモジュールを読み込む。
var toBrass = require("to.brass"); var mapView = toBrass.createMyMapView();
createMyMapViewはViewProxyが自動的に作ってくれるメソッド。
クラス名からモジュール名のプリフィックスを除いたものになる。
標準のTiMapViewと完全互換のMapViewを持つモジュールがここに完成した。
なんてアッサリなんでしょう。
ハマったところ
プロジェクト名とモジュール名の区別やクラス名の規約を理解していなくてちょっと右往左往した。
モジュール作成をいったん諦めて、Titaniumがビルド時に生成するObjective-Cのコードを直接修正するというダークサイドに落ちそうになるくらい右往左往した。
あとハマったところとは違うけど実行時に若干待ち時間が長くなったのはちょっと気になる。
初めてモジュールを作ってみた感想
モジュールの仕組みは良くできていて、要領が分かってしまえば気軽にいろいろ作れるくらい簡単。
素早く開発できてもTitaniumが提供する枠組みの壁にぶつかったら最後の一歩で要件を満たせないことがあるのでは?
といった懸念が今までは実はあったが、今回のことでそれはスッキリ払拭された。
自分でコードを書けば何でも乗り越えられる。(たぶん)
2010/02/18追記
本腰を入れてビルトインのクラスを拡張しようとすると、@privateで宣言されているプロパティが多い、というかざっと見た限り基本privateになっていて、サブクラスで思うように振る舞いをカスタマイズすることができなかった。
protectedでいいじゃない。Objective-Cはデフォルトもprotectedなんだしさ。
“Titaniumのモジュール作成にチャレンジ” に対して1件のコメントがあります。
コメントは受け付けていません。