Titanium Mobile は iPhone、Android アプリケーションを JavaScript でコーディングできるクロスプラットフォーム環境です。
Titanium を使っていてハマった点をメモしておきます。
Titanium Mobile のダウンロード
Titanium で Run Emulator - Launch しても反応が無い
多分、内部でエラーが発生しているか、単に反応が無いだけかも。一旦シミュレータを終了させるか、Stop ボタンを押して、再度 Launch してみる。
それでもダメなら、 build/iphone/build/build.log
を見てみる。ファイルの最後の方にエラー内容がでているので、心当たりを修正する。
build.log に FileNotFound のようなエラーがでてる場合
Titanium のプロジェクトが壊れている可能性が大。一度ソースコードをどこかに退避して、Edit タブから Delete Project する。そのあと、New Project で再度プロジェクトをつくり直してソースコードを上書き(Resources フォルダを上書き)してみる。これで治ることがほとんど。
シミュレータは動くけど、実機のほうで Install Error になる
iPhone 実機の iOS のバージョンと XCode に入っている SDK のバージョンが一致してないかも。一度 XCode を立ち上げて、ウィンドウ - オーガナイザ を開いてみて、動かす実機の iPhone の iOS のバージョンと XCode のサポートしているバージョンが違わないかを確認する。
プロジェクト名に Titanium という単語が入るとエラーになる
Titanium でプロジェクトを作成するときに、プロジェクト名に Titanium っていう単語が入るとコンパイルエラーになるっぽい(上の FileNotFound 系の原因かも)。 TestTitanium とか、TitaniumDemo とかエラーになるので注意する。
コーディング時の注意
Titanium.Contacts でグループをつくるときの注意
Titanium.Contacts.createGroup({ name: “HOGE” }) でグループつくると内部で setName が呼ばれないため、後で group.name で取得しようとしたときにアプリが落ちます。Titanium.Contacts.createGroup でグループを作ったあとに group.name = “HOGE” でグループ名設定する必要があるっぽい。
var group = Titanium.Contacts.createGroup();
group.name = "HOGE";
JavaScript で eval() は使えない
Titanium の JavaScript で eval() は使えません。試しに alert(eval("1+1")); と記述してみると、ブラウザでは2と表示されますが Titanium ではエラーになります。
2010/09/15追記
eval() 使うことができます。KitchenSink のサンプルにもあります。僕が使えないと勘違いしていた理由は、alert(eval(“1+1”)); とするとシミュレータがエラーで落ちるからで、alert(eval(“1+1;”)); とすると動くことを確認しました。。
Titanium は JavaScript で iPhone アプリケーションを開発できますが、JavaScript のすべてが使えるわけではないので注意!
JSON データのパースには JSON.parse() が使える
ちなみに、Titanium.Network.HTTPClient を使って取得したデータを JSON 形式に変換するのに、eval("(" + this.responseText + ")"); とする場面では、JSON.parse(this.responseText) が使えます。
日本語のファイル名を使っていると、build.py でエラーになる
JavaScript ファイル名に日本語ファイル名を使っていると build.py でエラーが発生します。
Exception detected in script: Traceback (most recent call last): File "/Library/Application Support/Titanium/mobilesdk/osx/1.4.0/iphone/builder.py", line 707, in main dump_resources_listing(project_dir,o) File "/Library/Application Support/Titanium/mobilesdk/osx/1.4.0/iphone/builder.py", line 157, in dump_resources_listing out.write(" %s %s\n" % (string.ljust(p,120),string.ljust(s,8))) UnicodeEncodeError: 'ascii' codec can't encode characters in position 25-30: ordinal not in range(128)