Hatena::ブログ(Diary)

このブログは証明できない。

2011-03-04

[][]Titanium Mobileの暗黒ノウハウを公開します。

WEB+DB PRESS Vol.61の特集は、Titaniumでした。実際にアプリを作りながらのチュートリアルになっています。正統派な入門記事です。





でも。期待してた内容ではありませんでした。私は、Titaniumの暗黒面が知りたいのです。いつものWEB+DB PRESSなら、そんな記事が多いのですが、さすがにまだ開発者が少なそうなTitaniumではアッサリ目に仕上げるしかないのでしょう。そこで、このどうでもいいブログで、Titaniumバッドノウハウ、いや、暗黒ノウハウをメモっておきます。


アプリを1本開発しただけですので、そこまでTitaniumのことを解っているわけではありません。間違っているところなどがありましたら、指摘してもらえるとありがたいです。暗黒ノウハウをみんなで共有しましょう。あと、スシなどをおごってもらえると、もっとありがたいです。




前提。

Titaniumのバージョンは、主に1.5.1です。途中で1.6.0がリリースされたので、状況は変わっているかもしれません。目の前の状況は、刻一刻と変わるものです。現状に甘んじてはいけません。あと、私が作ったのはiPadアプリです。Androidは試してません。




読み方。

Titaniumの読み方ですが、「チタニウム」ではなくて、「タイタニウム」だそうです。オシャレに「タイタニューム」と読んでもいいかもしれませんね。私は「藤岡弘、」と読んでます。




ビルドできない。

最初に試した頃にTARGET_BUILD_DIRのエラーが出ていました。今は大人になったので、出ていません。もし出たら、プロジェクトの設定をいじると直ります。


最近はまったく再現しないので、私も大人になったんだと思います。




シミュレーターが起動しない。

エラーが発生したり反応がなくなったりしてシミュレーターが起動しない場合は、再度「Launch」ボタンをクリックしてください。「Launch」が有効で「Stop」が無効になっている場合は、いくら待ってもシミュレーターが起動しないケースが多いです。また、いったん「Stop」して「Launch」しなければならない場合もあります。


私に話しかけても反応が無いときがありますが、再度話しかけると反応します。




アプリアイコン

Titanium Developerでアプリアイコンのファイル名を変更できます。このとき、存在するファイル名を書く必要があります。むしろ、設定を変えずに、Project/Resources/iphone/appicon.pngファイルを上書きするといいですね。


現在のTitaniumだと、アイコンやDefault.pngがうまく適用されなくて、イライラする日々を過ごすこともあるかもしれません。そんなときは、このサイトを見てください。




Application IDに使えない文字。

net.shunsuk.MyAppのようなApplication IDには、ハイフンが使えません。ドメイン名にハイフンを使っている人は、残念でした。Objective-Cで作る場合はハイフンもOKなのですが、Androidのパッケージ名で使えないっぽいです。


あと、試してないですが、Application IDには絵文字も使えないかもしれません。




使ってはいけないフォルダ名。

公式ドキュメントに載っているのかどうか分かりませんが、使ってはいけないフォルダ名があります。プロジェクトを作ると生成されるResourcesフォルダの下に、contentsフォルダとかresourcesフォルダとかを作ってはいけません。知らんかったら、トラップ以外の何者でもありません。


システムフォルダの中にエロ画像フォルダを作るのも、相手によっては逆効果だと思います。




なぜかエラーが起こる。

何の問題もないはずなのに、エラーが起こる場合があります。信じられないかもしれません。私も信じられません。でも本当です。しかも、エラー内容が表示されずに、スタックトレースが表示されます。どうしようもありません。試されてます。この場合は、Project/build/iphoneフォルダ以下をのファイルをすべて削除して、再度実行するとOKです。ちなみに、iphoneフォルダを消すと、デバッグできなくなりますので注意してください。


Titaniumオープンソースなので、なぜエラーが起こるのか解析して、パッチを送ってあげるといいですね。私もオープンなのですが、心を開いていないと言われることが多いです。




tiapp.xmlを直接編集。

基本的なことは、Titanium Developerで設定できます。もっと細かい設定をしたければ、プロジェクトのフォルダのtiapp.xmlを編集する必要があります。このへんの設定は、よく使うんじゃないでしょうか。

  • statusbar-style
  • statusbar-hidden
  • orientations

tiappって、なんて読むんでしょうね。血アップ。




TitaniumはTiと省略可能。

APIの話です。Titaniumは、Tiと省略することができます。なので、下のどちらでもOKです。

Titanium.UI.createView();
Ti.UI.createView();

原子番号22。チタン元素の一つで、金属光沢を持つ遷移元素です。




実機転送。

作ったアプリを実機に転送する場合、Titanium Developerから転送しようとすると下のような手順になります。


面倒なので、生成されたプロジェクトをXCodeで直接開いて実行する方が速いです。Project/build/iPhoneフォルダにプロジェクトファイルがあります。ただ、そのままでは動かない場合があるので、プロジェクトの設定を適宜変更してください。また、XCodeから実行することで、パフォーマンスツールを利用することもできます。


ビルドにはとても時間がかかります。不要なライブラリを削除すればいい気もしますが、そのへんは調べてません。不要なものを削除していって、結局自分も不要なんじゃないか、という疑問に達した人は、そんなことないよ!!




AdHocビルド

AdHocビルドするには、上で書いたように、プロジェクトファイルをXCodeで開いてビルドすると簡単です。プロジェクトにdist.plistなどを追加して、プロジェクトの設定をいじってください。


今日の弁当には、アドホックに玉子焼きがついてました。




includeの順番。

Objective-Cの#importと根本的に違います。LLのrequireのように、コードが展開されます。この時、includeの順番に注意しましょう。

Ti.include('A.js');
Ti.include('B.js');

こう書くと、AからBは見えますが、BからAは見えません

追記(2011-03-21):書き間違えてました。BからAは見えますが、AからBは見えません。


includeに関しては、こちらも参考に。


今日の弁当のハンバーグには、チーズがインクルードされていました。




フォントサイズ。

UI部品のフォントサイズを動的に変えたいとき。

textView.font.fontSize = 36;

では変りません。font自体を設定します。

textView.font = { fontFamily:'Helvetica Neue', fontSize:36 };

フォントにつらくなってきました。




Objectの生成。

ObjectやArrayを生成するとき。

ver o = new Object()
ver a = new Array()

こう書くと、警告が出ます。リテラルを使いましょう。

ver o = {};
ver a = [];

これって、JavaScript的な意味があるのでしょうか。そもそも、生きる意味などあるのでしょうか。




子Viewのサイズ。

子Viewのサイズを指定していなければ、親Viewの中で最大表示されます。この状態で親Viewのサイズを変えると、連動して子Viewのサイズが変わります。ここで、子Viewのサイズをピクセルで指定していると、連動しなくなるので注意してください。


Titaniumでは、サイズをパーセント指定できます。うまくやれば、マルチプラットフォームに仕上げられますね。でも、なかなか難しいと思うんです。ロジックだけを共有して、UIは切り分けた方がいいと思います。


私の子も、親の私に連動して、背が低いです。




jQuery

JavaScriptライブラリを使えるというのもTitaniumの特徴です。ですが、jQueryはそのままでは動きません。wondowやdocumentなどのオブジェクトがないためです。無理やりjQueryを使うには、こちらの記事を参考にしてください。


ただ、DOMがないので、jQueryを使うメリットがあるのかは微妙です。ちなみに、JQはジェットスター航空の航空会社コードです。紹介したので、サービスしてください。




アニメーション

Titaniumは、アニメーションがやりやすいです。MogSnapというアプリTitanium製らしいですが、アニメーションが楽しいアプリになっています。


アニメーションをガンガン使いたいのですが、いろんなタイミングに注意しましょう。例えば、下のコードではmessageWinがcloseするのは500ms後ですので、それまでにmessageWinが閉じられていることを前提としたコードが走るとマズイですね。まあ、これは分かりやすいケースですが。

messageWin.close({opacity:0, duration: 500});

私もMogSnapを使っていますが、コンビニおにぎりかマクドナルドカップ麺なので、使う機会がありません。ちょっと不健康な食生活ですね。健康のため、カップ麺ドラッグストアで買ってます。




画像のロードとリロード。

ImageViewは、createImageViewでimageを設定しても、そのタイミングでは画像をロードしません。親Viewにaddしたりして表示されるタイミングで画像をロードします。これは、iOSのUIImageViewと挙動が違うので注意が必要です。


また、ImageViewがremoveされても、すぐに画像がリリースされません。キャッシュしてるっぽいですが、詳しくは調べていません。そのImageViewを使う予定がなければ、サイズの小さい画像をimageにセットすることでメモリを節約しています。ホントはやり方があるかもしれませんが。


メモリ管理の必要がないところが、メリットでもあり、デメリットでもありますね。記憶を管理して、黒歴史を消し去りたいですね。マインドアサシン




ScrollViewの謎挙動。

ScrollViewにImageViewを乗せて画像をズームします。ズームした状態で、関係ないWindowを開きます。そして、Windowを閉じます。すると、ScrollView上のImageViewの位置がおかしくなるという謎挙動に遭遇しました。今のところ、原因不明です。


私もよく、原因不明の物欲に駆られて、原因不明のアマゾンで、原因不明の買い物をします。




クロージャ

クロージャを使わないと、思ったように動作しないケースがあります。ファイルを分割して、コンテキストが別になった場合などで必要になるんでしょうか。知らんけど。クロージャに慣れていない人は、復習しておいたほうがいいかもしれません。

var label = Ti.UI.createLabel();

view.layout = (function() {

var l = label;

return function(message) {

l.text = message;

};

})();


そんなに、くろーじゃないよ。って言いたかっただけです。




ちょっと。

コードスニペットを。イマイチなのも公開しときます。


デバッグするときにTi.API.info("デバッグ!")と書くのが面倒なので、utility.js的なファイルに下のコードを書いてapp.jsの先頭でincludeしておきます。

var info = Ti.API.info;

そうすると、こう書けます。

info("デバッグ!");

完璧グローバルですが、この場合はいいんじゃないかと思います。




clickイベントをハンドルする場合、こう書きます。

button.addEventListener('click', function(e) {
  info("clicked");
});

これも、utility.jsにこう書いておくと。

Object.prototype.click = function(handler) {
  var sender = this;

  this.addEventListener('click', function(e) {
      handler(sender, e);
    });
};

こう書けるようになります。

button.click(function(sender, e) {
  info("clicked");
});

完全に好みの問題なので、なにか便利になるわけではありません。Object.prototyeを汚染してますし、senderなんてなくてもe.sourceでOKですし、いろいろ腑に落ちないところはあります。でも、button.clickって書きたいんです。おすすめじゃないですが、いちおう書いておきました。




最後に、これもutility.jsに書いておきます。

var getImageFile = function(name) {
  return Ti.Filesystem.getFile(Ti.Filesystem.resourcesDirectory, 'images/' + name);
};

そうすると、imagesフォルダに入ってる画像を短いコードで呼び出せます。

imageView.image = getImageFile('profile.png');



フレームワーク

JavaScriptAIRアプリを作った時も思ったのですが、画面遷移まわりなど、薄いフレームワークを作ったほうがよさそうです。ガチガチのフレームワークは必要ないのですが、JavaScriptは柔軟性が高い分、統制がとれなくなる可能性が高いので。


まあ、柔軟性が低い上に統制もとれてない私に比べれば、たいした問題ではありません。




役に立つかどうかわかりませんが、いろいろ書いてみました。「間違っているところがあるかもしれません」と書いて逃げるのは好きではないのですが、間違っているところがあるかもしれませんのでご注意ください。


たくさん書いたので、スシが食べたいです。




tkntkfmtkntkfm 2011/03/07 22:40 とても参考になりました!ありがとうございます。僕も健康のために明日からカップラーメンはドラッグストアで買うことにします。

clubjulyclubjuly 2011/05/10 15:49 すばらしい!本文もよいですが、行間のボソリはもっとよいです。

icchaiccha 2011/08/02 18:37 コーディングの工夫がされていて、参考になりました。時々出るオヤジギャグっぽいところが リラックスした雰囲気を出してくれて勉強しやすくうれしいです。

8x rainbow8x rainbow 2015/03/17 23:08 コーディングの工夫がされていて、参考になりました。時々出るオヤジギャグっぽいところが リラックスした雰囲気を出してくれて勉強しやすくうれしいです

8x rainbow8x rainbow 2015/03/17 23:09 コーディングの工夫がされていて、参考になりました。時々出るオヤジギャグっぽいところが リラックスした雰囲気を出してくれて勉強しやすくうれしいです

dketdket 2015/04/05 01:13 僕も健康のために明日からカップラーメンはドラッグストアで買うことにします

floritaflorita 2015/04/15 17:14 これはアプリであるか、研究開発に必要

sukosuko 2015/06/29 08:05 僕も健康のために明日からカップラーメンはドラッグストアで買うことにします。

floteflote 2015/06/30 07:18 参考になりました。時々出るオヤジギャグっぽいところが リラックスした雰囲気を出してくれて勉強しやすくうれしいです

everrich 3everrich 3 2015/07/27 23:29 この真理を学んだことは非常に幸運な関心事であります

can ho 9 viewcan ho 9 view 2015/12/21 01:04 のために明日からカップラーメンはドラッグストアで買うことにします

quan vipquan vip 2016/01/01 03:27 私もよく、原因不明の物欲に駆られて、原因不明のアマゾンで、原因不明の買い物をします。

centaparkcentapark 2016/01/01 03:28 私もよく、原因不明の物欲に駆られて、原因不明のアマゾンで、原因不明の買い物をします。

VivariversidesVivariversides 2016/01/12 02:45 情報をありがとう。私は良いを感じています!

thekristathekrista 2016/01/13 22:22 IOS上でこのようなものを使用する方法?

visvis 2016/01/31 00:46 あなたの記事に便利です

vinhomes golden rivervinhomes golden river 2016/03/12 06:31 そんなに、くろーじゃないよ。って言いたかっただけです。

Can ho centa parkCan ho centa park 2016/03/26 15:58 情報を共有していただきありがとうございます

du an centa parkdu an centa park 2016/04/27 11:13 これは、1株面白いです!

nha dat quan tan binh 2nha dat quan tan binh 2 2016/04/29 17:15
共有していただきありがとうございます、それは彼女に多くの作業を助けました

can ho centa park tan binhcan ho centa park tan binh 2016/04/29 17:17 私はこのことについて聞いたことがない、素晴らしいです

yaibayaiba 2016/04/29 17:24 あなたがこのことを知っていない前に、共有のためにどうもありがとうございました

KyoshuKyoshu 2016/04/29 17:32 より多くのあなたの助けを楽しみにして、あなたに感謝

KennichiKennichi 2016/04/29 17:51 theo như mình đánh giá thì đây là phiên bản đáng giá nhất từ trước đến nay

ShogaShoga 2016/04/29 17:55
彼の評価によると、これはこれまでで最も価値のあるバージョンです

AkechiAkechi 2016/04/29 18:02 それを使用するか、わずかな誤差を受けるかどうか?

YosuaYosua 2016/04/30 01:01 あなたのシェアはそんなに私を恩恵を受けている、あなたに感謝

DaichikiDaichiki 2016/04/30 01:06 私は非常にこれを理解していない、あなたはそれの上に自分自身を教えてくださいすることができますか?

CieloCielo 2016/04/30 10:13 素晴らしい、これは私が知って初めてです、この撤退

MrKingMrKing 2016/04/30 10:15 あなたはそうではない問題を議論することができますするためにあなたの電話番号を与えることができますか?

vinhomes golden rivervinhomes golden river 2016/05/08 16:38 thank so much

can ho vinhomes golden rivercan ho vinhomes golden river 2016/05/08 16:41 website useful for me, thank so much

tri nam datri nam da 2016/05/14 16:37 website useful for me, thank so much, nice

phun moiphun moi 2016/05/16 10:35 tks, ilike it

phun moiphun moi 2016/05/16 10:36 あなたはそうではない問題を議論することができますするためにあなたの電話番号を与えることができますか?

imperia sky gardenimperia sky garden 2016/05/17 16:08 あなたのシェアはそんなに私を恩恵を受けている、あなたに感謝

vinhomes golden rivervinhomes golden river 2016/05/29 00:49 そんなに、くろーじゃないよ。って言いたかっただけです。

dau nong han quoc gia sidau nong han quoc gia si 2016/05/29 00:59 website useful for me, thank so much, nice

Chuong Duong HomeChuong Duong Home 2016/05/31 03:25 thanks for share!!

Depot Metro Tham LuongDepot Metro Tham Luong 2016/06/06 15:27 Yeah, I learn alot from your share, I would like to make friends with you! Hope you see my comment. Have a nice day

masteri quận 4masteri quận 4 2016/07/12 12:49 あなたはそうではない問題を議論することができますするためにあなたの電話番号を与えることができますか?

meocon84meocon84 2016/07/19 17:51 thanks so much!!! i'll come back

Senturia vuon laiSenturia vuon lai 2016/07/22 12:24 wow nice information men keep it up

xi grand courtxi grand court 2016/07/25 13:01 私にとって非常に有用

Richmond CityRichmond City 2016/07/25 22:34 Yeah, I learn alot from your share, I would like to make friends with you! Hope you see my comment. Have a nice day

vinhomes golden rivervinhomes golden river 2016/07/29 10:36 can ho vinhomes golden river
http://chungcuct2bnghiado.com/

can ho millenniumcan ho millennium 2016/07/31 17:57 僕も健康のために明日からカップラーメンはドラッグストアで買うことにします

to yen sao viet namto yen sao viet nam 2016/08/04 12:27 にあなたの電話番号を与えることができますか?

shophouse van phucshophouse van phuc 2016/08/12 00:57 Yeah, I learn alot from your share, I would like to make friends with you! Hope you see my comment. Have a nice day

can ho heaven riverviewcan ho heaven riverview 2016/08/16 02:05 wow nice information men keep it up

saigon peninsulasaigon peninsula 2016/08/16 02:06 Nice Blog, thanks so much

can ho masteri an phucan ho masteri an phu 2016/08/16 02:09 website useful for me, thank so much, nice

do choi thong minhdo choi thong minh 2016/08/16 15:48 Nice Blog, thanks so much

chanhanchanhan 2016/08/16 17:55 http://news1102.com/

chanhanchanhan 2016/08/16 17:55 http://news1102.com/

newvisionnewvision 2016/08/18 12:26 Thank you for share

sofasofa 2016/08/19 18:51 thanks information you

Masteri An PhúMasteri An Phú 2016/08/22 18:50 This helpful with me! Thanks so muchs!

lien ke phu luonglien ke phu luong 2016/08/23 01:16 Thanks for sharing. The infomation is useful

masteri an phumasteri an phu 2016/08/23 01:40 Give me some news , tks

can ho gia re quan 8can ho gia re quan 8 2016/08/23 01:42 wow nice information men keep it up

căn hộ city gate 2căn hộ city gate 2 2016/08/29 11:56 Thank you for share ...

palm heightspalm heights 2016/08/31 00:17 これはアプリであるか、研究開発に必要

d-velad-vela 2016/08/31 00:18 website useful for me, thank so much, nice

biet thu lavilabiet thu lavila 2016/09/02 05:07 コーディングの工夫がされていて、参考になりました。時々出るオヤジギャグっぽいところが リラックスした雰囲気を出してくれて勉強しやすくうれしいで

Senturia Vuon LaiSenturia Vuon Lai 2016/09/09 16:32 または、簡潔かつ簡潔な記事

sofa da cao capsofa da cao cap 2016/09/09 18:28 Thanks!

chung cu mon centralchung cu mon central 2016/09/10 01:26 Yeah, I learn alot from your share, I would like to make friends with you! Hope you see my comment. Have a nice day

chung cu sunshine centerchung cu sunshine center 2016/09/10 01:55 wow nice information men keep it up

chung cu an binh citychung cu an binh city 2016/09/10 02:01 Appreciate this post. Will give it a try.

chung cu central fieldchung cu central field 2016/09/10 02:03 それを使用するか、わずかな誤差を受けるかどうか?

duc long golden landduc long golden land 2016/09/10 14:12 Thank you for share ....

tienphat2906tienphat2906 2016/09/10 18:50 Thank you for share

chung cu dolphin plazachung cu dolphin plaza 2016/10/20 10:53 thank you so much

chung cu riverside gardenchung cu riverside garden 2016/10/20 10:55 Mo ban chung cu riverside garden 349 vu tong phan

an binh cityan binh city 2016/10/20 10:56 thông tin chung cu an binh city 232 pham van dong

mo tai khoan forexmo tai khoan forex 2016/10/20 10:58 mo tai khoan forex demo uy tin tai viet nam

can ho elite park binh thanhcan ho elite park binh thanh 2016/10/24 19:46 thanks for your infomation

Feliz En Vista Feliz En Vista 2016/11/25 03:02 Thank you for share

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証