最近のTitanium
前回の連載からの間に、Appcelerator社の開発者Blog でいくつか大きな発表がありました。それによると、Titaniumの統合開発環境であるTitanium StudioがRC1になったり、Titanium Mobile SDKの次期バージョン1.7.0がRCになったりしているようです。Titanium Mobile SDK 1.7.0はAndroid開発での機能が強化されており、すでにほとんど問題なく使用できるので興味のある方は最新版をダウンロードして使ってみると面白いかもしれません(SDKのインストール方法についてはこの記事の最後に記載しています) 。
Androidでの開発での注意点
さて前回の記事 でAndroidでの開発環境構築ができたので、今回からAndroidでの開発について説明していきます。TitaniumはiPhoneアプリ開発にもAndroidアプリ開発にも対応しており、ほとんど同じようなコードでアプリを作成することができます。とは言っても、まったく同じコードでiPhoneとAndroidのアプリが同時に作成できるということではありません。今回はどのような点がAndroidアプリ作成の問題になるのかを先に解説していきます。
おなじViewを作るのは難しい
iPhone開発でのサンプルアプリは
var tabGroup = Titanium . UI . createTabGroup ({});
var win1 = Titanium . UI . createWindow ({
url : 'table_view.js' ,
title : 'Tab 1' ,
backgroundColor : '#fff'
});
var tab1 = Titanium . UI . createTab ({
window : win1
});
win1 . hideTabBar ();
tabGroup . addTab ( tab1 );
tabGroup . open ();
というようなコードをapp.jsに書き、TabGroupは作成するがTabBarを表示しない、という実装をしてきました。一見トリッキーな実装ですが、これはTabGroupが存在しないと正しく動かなかったり実装が難しくなる機能を使うための処置でした。しかし、現在のことろこの方法はAndroidでは利用できません。windowオブジェクトのhideTabBarが機能せず、タブバーが常時表示されるようになります。
これを避けるには、tabGroupを利用せず
var win1 = Titanium . UI . createWindow ({
url : 'table_view.js' ,
title : 'Tab 1' ,
backgroundColor : '#fff'
});
win1 . open ();
というように、直接windowをopenしてしまえば、当然タブバーが表示されなくなります。もちろん、TabGroupを必要とする機能は使えなくなります。iPhoneでTabGroupを使う大きな理由は、画面上部のNavigationBarを表示したまま画面遷移を行いたいということですが、AndroidにはそもそもNavigationBarに当たるものがなく、画面遷移は本体側のボタンを利用することが多くなります。よって必要とする画面構成によってはTabGroupの利用をやめることも考えましょう(一部機能がTabGroupが無いと機能しないことがありますので注意してください) 。
画面解像度が異なる
iPhoneでは対象がiPhone 3GでもiPhone 4でも、あるいはiPod Touchであっても画面解像度は縦480×横320であると考えて、UIの位置を決めることができました。しかし、Android端末にはいわゆるスマートフォン型の物から、スレートと呼ばれる大型のものまでさまざまな端末が存在し、画面解像度もまちまちです。そのため多端末に対応するためにはUIの位置を画面解像度から計算して決定するか、画面解像度ごとにデザインを設定することのできるJSSという機能の利用を考えるかのどちらかが必要です。この二つの方法については次回以降解説します。
エミュレータが遅い
Androidエミュレータは、iPhoneのそれと比較すると非常に速度が遅く使い勝手の悪いものです。特に起動が遅く、開発中にコードを書きなおすたびに起動していると開発サイクルが非常に悪くなります。回避する方法は2つあって、ひとつはエミュレータを終了させないことです。すこしトリッキーな使い方になりますが、以下の方法で終了させずに新しいコードを反映させることができます。
すると、アプリが起動中の場合は一旦終了してもう一度立ち上がるようになります。ただしこの方法も失敗することがあるので、上手くアプリが再起動しないときは諦めてTitanium DeveloperのStopをクリックしてエミュレータを終了してください。
普段のエミュレータ動作も相当に遅いので、なるべくエミュレータの画面解像を低くしておくことでいくらか動作をまともにすることができます。また、エミュレータでのアプリ起動までのコンパイル状況を確認するために、Titanium Developerの表示するログレベルをDebugにしておくと便利です。
もう一つの方法は、エミュレータの使用をやめて実機で開発を行うことです。iPhoneよりも実機への転送が簡単なので、遅いエミュレータよりは快適なことが多いです。しかし、実機に転送してしまうと、コンソールを使ったデバッグができなくなるのでこれはこれで難しいところです。
実機へ転送するのには、USBケーブルでPCとAndroidを繋ぐのとあわせてAndroid側の設定も必要です。
Androidの設定画面から、「 アプリケーション」>「開発」>「USBデバッグ」と遷移してこのUSBデバッグの項目をONにしてください。
OAuthがなかなか上手く動かない
本来、今回の記事では今までのTwitterサンプルアプリを、Androidでも動くようにしてどちらでも開発が簡単ですね。というような事を書くながれにしたいところなのですが、OAuthに関してはなかなか一筋縄にいきませんでした。昨年から多くの人がこの問題にチャレンジしていて、Appcelerator社のQ&Aにも、
という記事があります(残念ながらQ&Aにある、birdhouseというライブラリは筆者の環境では動作しませんでしたが) 。また、本連載でも利用している、mogyaさんのtwitter_apiについてのパッチも試行されています。
筆者も実験を繰り返しており、もう少し検証した上でこの連載で利用しようと考えていますのでもうしばらくお待ちください。
まとめ
今回は、Androidでの開発について問題となる点のエミュレータの動作と、Androidの実機に転送するさいの注意についてまとめました。すこし物足りない内容であったかもしれませんが、iPhoneに比較するとAndroidでの開発は問題が多いので開発に入る前に先に解説させて頂きました。色々と難しい点はあるのですが、冒頭に書いたようにSDK 1.7.0もまもなくリリースされ、Android向けの開発も日々改善されていますし、OAuthを利用するような複雑なアプリでなければ十分に利用価値のあるものです。ということで、次回から実際の開発例に入りますので、Android開発の難しい点に諦めずに次の連載も楽しみにしていただけたらと思います。
付録
Titanium Mobile SDKのインストール方法
http://builds.appcelerator.com.s3.amazonaws.com/index.html から最新のSDKをダウンロードします。左側カラムの最上部、OSX用のパッケージをダウンロードしてください。branchが1_7_Xになっているか確認してください。
ダウンロードしたzipアーカイブを解凍します。
解凍すると“ /osx/1.7.0” というディレクトリ構造になっているので、この1.7.0というディレクトリを“ /Library/Application Support/Titanium/mobilesdk/osx” に移動します。
これでインストールは完了です。Titanium Developerを起動すると、プロジェクトのEdit画面からSDKのバージョンを変更できるようになっているはずです。