[Titanium]CFBundleVersion must be no longer than 18 charactoers

個人的なポリシーで、アプリケーションのバージョン番号は、1.0, 1.1, 2.0とかじゃなくて、20110923, 20110925…っていうふうに年月日でつけることにしています。
どこでマイナーバージョンを上げてどこでメジャーバージョンを上げるかとか悩んでも仕方ないし、ユーザーさんにとってはどっちが新しいかさえ分かればOKなんだから、無理に数字に丸める理由はないよね。

というような経緯で俺ポリシーを採用していたら、えらい目にあいました。

理由は知らないんだけど、Titanium MobileはInfo.plistに書いてあるBundleVersionの後ろに、タイムスタンプをくっつけてしまいます。例えばInfo.plistに「1.0」と書いた場合、実際のビルドに使用されるCFBundleVersionは「1.0.1316956026」という具合に。
普通の人はバージョンなんてせいぜい5文字だから、
日付時刻をつけても弊害はなかったのだけれど、年月日方式だと、「20110925.1316956026」となってしまいます。実はバージョン番号には18桁までという制限があるので、これだとCode SignをするときのVelificationでエラーになってしまうのです。

厄介なことに、このアプリの旧バージョンはXCodeで開発していたので、年月日方式ですでにリリースしてしまっています。
しょうがないので、「3.0」にしてみたんだけど、これも「The key CFBundleVersion in the Info.plist file must contain a higher version than that of the previously uploaded version.」ということでどうにもならなくて泣きそうに。Adhoc Buildまで無事通って、最後の最後に発覚するので心理的ダメージがでかいです。

そういうわけで、このTitanium Mobileの余計な処理を止める方法。
builder.py ( /Library/Application Support/Titanium/mobilesdk/osx/#{TITANIUM_SDK_VERSION}/iphone/ )をひらいて、この辺をコメントアウトする。

僕から見たら余計な処理だったけど、書いてあるからには必要な理由があったのだろうから、普通の人はまねしない方がいいと思う。
バージョン番号が長くなって困った方だけ、自己責任でどうぞ。

おまけ:Distribution Buildのハマリどころ

 iPhoneアプリの開発は、エミュレーターで動いて、AdHocビルドも動いているのに、最後の最後でリリースできない!って苦労することが多い気がする。
自分が今回はまった点と解決策。

  • Distribution Buildした後、Validateするとすっごい長いエラーダイアログが出る
    →キャプチャしておくのを忘れたんだけど、ほぼ画面いっぱいのエラーダイアログ。長すぎて結局何がエラーなのか全然分からなかったんだけど、ダイアログの上でcommand+Cを押すと全文がコピーできるので、エディタに貼り付ければ内容を見ることが出来る。
  • 「Icon specified in the Info.plist not found under the top level app wrapper: icon.png Unable to verify icon dimensions, no icon found」
    →可能性1:info.plistに書いてあるアイコンファイルと実際においてあるアイコンファイルの名前が違う。大文字小文字にも注意。
    →可能性2:アイコンファイルが8bit pngになっている。24bit pngじゃないとダメらしいです。
  • 「a sealed resource is missing or invalid」
    →Resourcesに余計なファイルがあると起きるらしい。.gitとか.gitignoreとかそのへんをひと通り削除したら出なくなった
  • 「CFBundleVersion must be no longer than 18 charactoers」
    →上に書いたとおり。「バージョン番号は18文字以下でないといけません」。

CodeSignとかMobileProvisioningになってしまえば、もはやTitaniumMobileであることはあまり関係が無いので、「エラー文字列 iPhone」でググるのが王道のような気がしました。

[titanium]TKAnimationSampleはTitanium開発者必見のアニメーションサンプル集

Ti.Developers.meeting vol 0.3 で、MogSnapのコバヤシトールさんに、アニメーションについてお話していただきました。

その際の説明用サンプルとして掲示されたTKAnimationSampleがとても素晴らしかったのでご紹介。

toru0325/TKAnimationSample – GitHub

TKAnimationSample1.png
KitchenSinkみたいに、複数のサンプルが見られるようになっています。

TKAnimationSample2.png
HelloWorld.js。静止画見ても何のことだか分からないと思いますが、HelloWorldが下から飛び出してくるサンプルです。

TKAnimationSample4.png
buttons.js。ボタンが出現するサンプル。よりかっこいいbuttons_with_scale.jsというのもあります。

TKAnimationSample5.png
赤いボールが複雑な軌跡を描いて飛び回るredbox.js。「Hint」ボタンを押すことで、どういうふうに実現されているかを見ることが出来ます。

TKAnimationSample6.png
AndroidやiPadのように画面上にポップアップを出現させるInfo_view.js。iPhoneではあまりやらないことになってますが、実現させたい人はたくさんいると思うので、そういう方はこのサンプルを参考にすると良いと思います。

ゲームやかわいいアプリケーションにアニメーションが必須なのはいうまでもないですが、情報系のアプリケーションでも、ちょっとアニメーションを利かせておくことで、
ユーザーさんの目線を誘導することが出来るのでとても役に立ちます。
APIリファレンスを見て実装してもなかなか上手く動かないのですけど、TKAnimationSampleで動いているサンプルをみて実装するのなら簡単に実装できますよね。
自分はTKAnimationSampleを見て30分くらいで、今作っているアプリにアニメーションを追加することが出来ました。
とても勉強になるので、ぜひさわってみてくださいませ。

[ti.devs.me] window.urlを使わないプログラミング

明日16日のTi.Developers.meeting vol 0.3 in Kyotoで、「window.urlを使わないプログラミング」というテーマでお話させていただきました。

Ti.Developers.meeting.001.jpg
Ti.Developers.meeting.002.jpg
Ti.Developers.meeting.003.jpg
Ti.Developers.meeting.004.jpg
Ti.Developers.meeting.005.jpg
Ti.Developers.meeting.006.jpg
Ti.Developers.meeting.007.jpg
Ti.Developers.meeting.008.jpg
Ti.Developers.meeting.009.jpg
Ti.Developers.meeting.010.jpg
Ti.Developers.meeting.011.jpg
Ti.Developers.meeting.012.jpg
Ti.Developers.meeting.013.jpg
Ti.Developers.meeting.014.jpg
Ti.Developers.meeting.015.jpg
Ti.Developers.meeting.016.jpg
Ti.Developers.meeting.017.jpg
Ti.Developers.meeting.018.jpg
Ti.Developers.meeting.019.jpg
Ti.Developers.meeting.020.jpg
Ti.Developers.meeting.021.jpg
Ti.Developers.meeting.022.jpg
Ti.Developers.meeting.023.jpg
Ti.Developers.meeting.024.jpg
Ti.Developers.meeting.025.jpg
Ti.Developers.meeting.026.jpg
Ti.Developers.meeting.027.jpg
Ti.Developers.meeting.028.jpg
Ti.Developers.meeting.029.jpg
Ti.Developers.meeting.030.jpg
Ti.Developers.meeting.031.jpg
Ti.Developers.meeting.032.jpg
Ti.Developers.meeting.033.jpg
Ti.Developers.meeting.034.jpg
Ti.Developers.meeting.035.jpg
Ti.Developers.meeting.036.jpg
Ti.Developers.meeting.037.jpg
Ti.Developers.meeting.038.jpg
Ti.Developers.meeting.039.jpg
Ti.Developers.meeting.040.jpg
Ti.Developers.meeting.041.jpg
Ti.Developers.meeting.042.jpg
Ti.Developers.meeting.043.jpg
Ti.Developers.meeting.044.jpg
Ti.Developers.meeting.045.jpg
Ti.Developers.meeting.046.jpg
Ti.Developers.meeting.047.jpg
Ti.Developers.meeting.048.jpg
Ti.Developers.meeting.049.jpg
Ti.Developers.meeting.050.jpg
Ti.Developers.meeting.051.jpg
Ti.Developers.meeting.052.jpg
Ti.Developers.meeting.053.jpg
Ti.Developers.meeting.054.jpg
Ti.Developers.meeting.055.jpg
Ti.Developers.meeting.056.jpg
Ti.Developers.meeting.057.jpg
Ti.Developers.meeting.058.jpg
Ti.Developers.meeting.059.jpg
Ti.Developers.meeting.060.jpg
Ti.Developers.meeting.061.jpg
Ti.Developers.meeting.062.jpg
Ti.Developers.meeting.063.jpg

[titanium]画像を使わずにボタンを表示

TitaniumMobileにはSystemButtonというのがあって、ローカルに画像を持っていなくても標準的アイコンのボタンを表示させることができる(iphone only)。

systembutton.png

でも例えば、ブラウザでよく見る左右の三角形、forward/backボタンはsystemButtonに存在しない。
デザイナさんと一緒にお仕事をしている人はいいのですけど、プログラマが適当に作ったアプリでは、こういうのを下手に描いたせいでデザインが素人っぽくなってしまったりする。著作権的なものには目をつぶって他のアプリからキャプチャするにしても、この程度の画像をいちいち切り出すのはめんどくさいよね。

そこで、文字コードを使ってそれらしい文字をtitleに指定してみた。

// Forward and back button for browser.
var buttonForward = Titanium.UI.createButton({
title:String.fromCharCode(0x25b6)
});
var buttonBack = Titanium.UI.createButton({
title:String.fromCharCode(0x25c0)
});
win.setToolbar([flexSpace,buttonBack,flexSpace,buttonStop,flexSpace,buttonReload,flexSpace,buttonForward,flexSpace]);

browserbuttons.png
お、いい感じ。もしかしてもっと色々出来るかも?

// OK. more buttons!
var buttonApple = Titanium.UI.createButton({
title:String.fromCharCode(0xf8ff)
});
var buttonCommand = Titanium.UI.createButton({
title:String.fromCharCode(0x2318)
});
var buttonOption = Titanium.UI.createButton({
title:String.fromCharCode(0x2325)
});
var buttonReturn = Titanium.UI.createButton({
title:String.fromCharCode(0x23ce)
});
var buttonForward2 = Titanium.UI.createButton({
title:String.fromCharCode(0x25c1)
});
var buttonBack2 = Titanium.UI.createButton({
title:String.fromCharCode(0x25b7)
});
var buttonNote1 = Titanium.UI.createButton({
title:String.fromCharCode(9833)
});
var buttonNote2 = Titanium.UI.createButton({
title:String.fromCharCode(9834)
});
var buttonNote3 = Titanium.UI.createButton({
title:String.fromCharCode(9835)
});
win.setToolbar([flexSpace,buttonForward2,buttonBack2,buttonApple,buttonCommand,buttonOption,buttonReturn,buttonNote1,buttonNote2,buttonNote3,flexSpace]);

morebutton1.png
もうソースコードは省略するけど、こういうのも出せる。

morebutton2.png

WEBの世界では、エンドユーザーが持っているフォントにその文字がある保証がなかったり、フォントによってどんな文字が出るか予想ができないということで、こういう文字を使うのはご法度ということになっていた。
iPhoneアプリをTitaniumMobileで作るのであれば、クライアントのフォントは常に同じだから、かなりの数の記号を使うことができる。
残念ながらtoolbarにはフォントを指定できないみたいなので、toolbarに出せる文字はヒラギノで出せる範囲に限られるみたいだけど、labelとか普通のボタンだったら、font指定することで、もっと変な記号も出せるかもしれない。

文字と文字コードの関係を調べるには、下記サイトか、Mac標準の「文字ビューア」を見ればOK.

Androidは試してないのだけれど、原理的には同じようなことができるはず。
でもAndroidの場合、インストールされているフォントが保証されないから、機種によってボタンが見えなくなったりするリスクがあるかも。

テストアプリのソースコードは下記。もちろん、画像ファイルなんて不要です:-)

松山秀太郎 ペーパーモデル展が超かっこよかった

IMG_1612.JPG
松山秀太郎 ペーパーモデル展を見に行ってきました。

松山秀太郎 ペーパーモデル展
(残念ながら公式サイトがないのですが、上記は知り合いの方のブログで、松山君がどういう人なのか、大変わかりやすく説明されています。)

まだ声変わりもしていない12歳の男の子なのですが、写真を見ただけで展開図を起こして上のようなペーパーモデルを作ることが出来ます。

IMG_1622.JPG
この電車が超かっこいい!

IMG_1626.JPG
「神は細部に宿る」という言葉を思い出してしまいました。

IMG_1615.JPG
新聞紙トレイン。影がいい感じに写ってますが、撮った人じゃなくて元の作品がいいからですw

IMG_1608.JPG
展開図。精緻な図面なのに文字は小学生相応なのが萌えポイントです。

IMG_1617.JPG
机を見ると、定規だけじゃなく、デジタルノギスまでありました。

残念ながらそんなに大きな個展じゃないので、今回見られるチャンスはあと一回。9月11日、13:00~18:00、天神橋3丁目のR+Sギャラリーというところで見ることが出来ます。入場無料。もし良かったらどうぞ。

↓この建物の2Fがギャラリーになっています。

大きな地図で見る