2012/12/15

Titanium 2.x traps


これは、Titanium Mobile Advent Calendar 2012 の参加エントリです。

いやーついに Titanium 3.0 がリリースされましたね! このエントリでは、僕が 2.x を触っていてハマった様々な罠について述べていきますが、3.0 以降ではこれらが全てfixしていることを祈っています。

今回のエントリでも、自分が iPhone, Android 両対応アプリを開発した経験に基づいていますので、皆様の環境では必ずしも再現しない場合もあると思いますが、その点は御容赦くださいませ m(__)m

1. String.format ってクロスプラットフォームで使うときはちょっと注意いりませんか?

今年の Advent Calendar でも触れられている String.format 関数。C言語でのsprintf関数の如く、文字列処理では重宝する関数なのでいやー便利ですよね皆さん! といいたいところなんですけど、、

 String.format("input value was %d  !!!", "hogehoge");

とかいう具合で誤った使い方をすると以下のような感じだったと記憶しています。

A) iPhone ではアプリが落ちる。
B) Android ではスルーされた。。なんで通るんだ。。

そもそも文字列連結処理が面倒だという理由で この関数を自分は使っていたので、"+" 演算子を使って回避した記憶があります。

2. "iphone" というフォルダ名を [Resources|ui] ディレクトリ以下に作るとアプリが落ちる件

http://developer.appcelerator.com/question/136031/couldnt-find-module-error-on-device

android とか、 iphone という名前は root フォルダで予約されているようで、ビルドが壊れてしまいました。"Could'nt find module error on device" というエラーメッセージが出たときは要注意です。

自分はこの罠によって iPhone アプリのエミュレーターで何の前触れもなくアプリが落ちる事象に遭遇しました。3時間悩み、フォルダ名を変えて動いたときはなんのこったいと頭をかきむしった記憶があります。

3. アプリを起動したとき "application restart is required" と表示される

https://jira.appcelerator.org/browse/TIMOB-4941

これは Android 限定の現象ですが、Google Play から落としてきた配布済みのアプリを Google Play から、またはアプリのショートカットから起動すると "application restart is required" と表示されてしまうという事象がありました。

Titanium 2.0 SDK 以降でこの現象は fix されたとありますが、2.1.x でも再現しました。

Google Play にアップロードした時以降「だけ」この現象が再現するのは始末が悪かったです。回避策は、 tiapp.xml に以下のような設定を入れることです。

   <property name="ti.android.bug2373.disableDetection" type="bool">true</property>

4. UTF-8 以外のエンコーディング問題

御存知の通り Titanium Mobile では UTF-8 が使われています。ですがいろいろな理由で UTF-8 以外の文字コードを使わざるを得ない場合もあったりなかったり。。

必要な場合は Escape Codec Library を使うのがよいとは思いますが、ライセンスが不明確なので組み込みは微妙です。

http://www.vector.co.jp/soft/other/java/se342855.html

5. JSS (JavaScript StyleSheet) の扱い

もはや 3.0 以降では別の形でウィジェットの装飾方法が確立されているため、この記述は役に立たないでしょうが、一応記しておきます。
GUIの装飾をJavaScriptで行うjss (Javascript Style Sheet) はドキュメントは残っていないし、仕様と動作が[不明確|不便]なため、自分は結局いろいろ試した末使いませんでした。JSS の記述は以下にあったりしますが、2.x では使わない方がよいでしょう。

http://gihyo.jp/dev/serial/01/titanium/0015

JSSの代替となる流儀は、require してプラットフォームごとに設定を切り替える方法です。僕は以下にあった方法を使いました。

http://higelog.brassworks.jp/?p=1144


おわりに

Titanium 3.0 では Alloy という MVC フレームワークで大幅にアプリの開発が変わるでしょうが、個々のコンポーネントやアプリを公開する時にまつわるバグや罠はいろいろなところに潜んでいることでしょう。けどそれを乗り越えて皆でノウハウをシェアしつつアプリ開発を楽しめればよいなーと思います。再度書きますが、3.0 以降では変な罠を踏みたくないものですね!

次は @astronaughts さんですね! 宜しくお願いします!

0 件のコメント: