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 のサポートしているバージョンが違わないかを確認する。

iPhone オーガナイザ.gif

プロジェクト名に 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)