TitaniumMobileでAndroidアプリを書いてみた

表題のとおりなんですがTitaniumMobileでAndroidアプリを書いてみた。

目的はTitaniumMobileの調査。使用したバージョンはTitaniumMobile2.1.3。

結論から書くと、細かいハマりどころはまだあるものの、用途を選べば今の段階で大体使えそうかな~という感じ。
1年前に比べるとかなりこなれた感がある。

とりあえず作ったアプリの宣伝。


作ったアプリ ニュースクリッパー(NewsClipper)

ニュースクリッパー(NewsClipper)

https://play.google.com/store/apps/details?id=com.ueebee.newsclipper

全国紙・地域ブロック紙の情報を閲覧できるツールです。個人的に地下鉄に乗ることが多いので、オフライン状態で閲覧可能になってます。


今のところ読める新聞
[全国紙]
読売新聞・朝日新聞・毎日新聞・産経新聞・ロイター

[ブロック紙]
北海道新聞東奥日報河北新報秋田魁新報・千葉日報・神奈川新聞・新潟日報信濃毎日新聞岐阜新聞中日新聞福井新聞・京都新聞・紀伊民報山陰中央新報山陽新聞中国新聞徳島新聞愛媛新聞佐賀新聞・宮崎日日新聞・沖縄タイムス琉球新報

※今後の予定
・わかってるバグ潰す
・ダサいのでUI変えたい
・地方紙追加(残り9紙くらい)
・ジャンル分け機能欲しい(政治・地方・スポーツetc)

※感想
地方紙というか地方のニュース結構面白い。

よかったら使ってみてください。


以下TitaniumMobileを使ってみた感想・技術メモを書きます。

良いとこ1:コード量減る

これはまじで減ります。javascriptだからってのが大きな理由だと思いますが、大体体感で1/2から1/3程度になるような感覚。



良いとこ2:coffeescript便利

TitaniumMobileとは直接的には関係ありませんが、javascriptの足りないところをかなり補ってくれる。クラスが手軽に書ける&thisが@にバインドされてて直感的等々メリットでかい。またcoffee -wcでjavascriptを吐き出すとグローバルを汚さないので安心。



良いとこ3:容量が思ってたほど大きくならない

開発時に実機転送してた時「容量でかいな~」というのが正直なところでしたが、google playに公開するように、サイン付きのapkを書き出す際に1/3程度に圧縮してくれる。調査してませんがgoogle clousure toolsで圧縮してるのが効いてる?それともデフォルトでapk作るときに圧縮するからこんなもん?



微妙なところ1:マルチプラットフォームだけど・・

マルチプラットフォームはおそらく微妙。メインの処理部分は共通でいけるっていうところはありがたい。が、スマホ向けアプリの場合UI作るのにコードを結構書かなきゃいけない場合が多くて、UI向けのところはandroid向け、iphone向けで結構違う。



自分用メモ1:TabBarダサいから消したい

platform/android/res/layout/titanium_tabgroup.xmlへ以下を書く

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@android:id/tabhost"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent">
  <LinearLayout
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:padding="0dp">
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="0dp"
        android:layout_weight="1"/>
    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="0"/>
  </LinearLayout>
</TabHost>

javaネイティブで書くとき風味。



自分用メモ2:初回起動時にリスタート求められる

ちなみに初回起動時でも、android端末の種類によっては正常に起動できるものもあるらしい。
ついでに自分の環境だと、初回起動時というわけではなくて、google playの起動ボタンを押すとこの現象が出た。

Titanium2.1.2で解消されてるといってるけど、以下をtiapp.xmlへ追記しないとダメだった。

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

元ネタ

http://developer.appcelerator.com/question/141450/android-issue-2373-missing-intent-categorylauncher-or-flatactivityresettaskifneeded-restarting-app



自分用メモ3:versionCode、versionNameはtiapp.xmlに書けない

バージョンアップする時に、versionCode、versionNameをアップしていくことになるけど、tiapp.xmlへ記載する方法が見つからなかった。解決方法は

一旦コンパイル→build/android/AndroidManifest.xmlをplatform/android/AndroidManifest.xmlへコピー→manifestのversionCode、versionNameを書き換えてコンパイル

これでversionCode、versionNameが上がる。



自分用メモ4:画面を縦固定にしたい場合

これもplatform/android/AndroidManifest.xmlを書き換える。activityにandroid:screenOrientation="portrait"を追記すればOK。



自分用メモ5:preferenceが使いにくい

設定画面が簡単に作れるPreferenceクラスですが、TitaniumMobileだとイベントが足りないと感じた。
closeイベント、changeイベントとかが取れるとありがたい。
仕方がないので今回はwindowのfocusイベントで代用。

追記:TitaniumMobile3.0βではイベント追加されてる模様



番外編1:google playからダウンロードエラー

エラー詳細は

サーバーからの情報の取得中にエラーが発生しました。[RPC:AEC:0]

結果わからずじまいだったのですが、
http://ameblo.jp/mu-rrr-ci/entry-11394553434.html
と同じ症状。

症状も同じで、
・初版をGoolePlayへアップロード
・数時間後ダウンロードできるようになる
・バグに気づいて修正
・再アップロード
・再アップロードから4時間後くらいに、アップデート通知がandorid端末に届く
・ここでエラー サーバーからの情報の取得中にエラーが発生しました。[RPC:AEC:0]
・PCサイトからインストールはしばらくしたら可能になった
android端末からはインストールできない
・寝る
・再アップロードから12時間後くらい?android端末からも正常にダウンロード可能
という状態。





感想

TitaniumMobile使えます。あと一歩って感はまだあるけど、WEB連携・リアルタイム性がそれほど求められないアプリなんかは、ネイティブで書くより楽な気がします。無い機能もモジュールでカバーできそうですし、もう少しこなれたらTitaniumもっと増えそうな予感。今後に期待です。