2009年10月2日(金)東京・代々木にて、ToyCamera開発者 深津貴之 (ふかつたかゆき)氏と、NatsuLion for iPhone開発者 森琢磨 (もりたくま)氏をお迎えし、「 FlashユーザーのためのiPhoneアプリ開発入門 」を開催した。
今回のイベントはFlashユーザーに的を絞った物だったが、スピーカーもビックネームということで即満席に。FlashユーザーのiPhoneアプリ開発に対する興味・関心がいかに高いかをうかがわせる。
会場の様子
iPhone application development for Flash users.
1人目の登壇者は、fladdict で知られ、日本のFlash界に大きな影響を与えている深津貴之(ふかつたかゆき)氏だ。iPhoneアプリ開発者としても著名で、ToyCamera をはじめ、OldCamera、QuadCamera などのカメラアプリを多く手がけている。どれもApp Storeでは上位に食い込む人気アプリである。
最近では、2人目の登壇者 森琢磨(もりたくま)氏と共に、ミニチュア風写真を作成できるTiltShift Generator を開発。当初AIRアプリとして公開されたことで話題を呼び、国内外で爆発的にヒットしている。なお、TiltShift Generatorでユーザーが編集した画像は、Twitterのハッシュキー(#TiltShiftGen)で検索し一覧することができる。
深津貴之氏
Flash使いがiPhoneに挑戦する理由
深津氏は、” Flash使いがiPhoneに挑戦する理由” として、” Flashは今後モバイルに移行する” とし、「 今後Flashをやっていくとしても、その先行として今のうちに実験をかねていろいろやっておくのもおもしろいのではないか」と考えているという。さらに「Flashをやっている人の強みとして、Webに基盤を持っているため、キャンペーンサイトやバナーなど、自分達でアプリの露出を行うことができ、かつiPhoneにはUIの洗練されたアプリが少なく、インタラクティブな部分ではFlashで培ったノウハウを持ち込むことで、ポジションを確保できる」と語った。
iPhoneとFlashの違い
それでは、” iPhoneとFlash” では、どう違うのだろうか。
氏によれば、” 指で操作するということ” と、” マウスで操作すること” が全く異なると語る。指ではマルチタッチやフリック入力などのいわゆるジェスチャーが可能であり、マウスとは異なった操作が生じる。つまり、インターフェースにもその違いを反映させ、最適化するよう考えなければならないということだ。Flashと同じ考えで作れば、使いづらいものになってしまう。注意点として、” 小さすぎるボタンは押せない” ということ、” ロールオーバーがない” ということが挙げられた。iPhoneでは、ロールオーバーの概念が無いため、ボタンはボタンであるとして、明確にデザインをする必要があるのだ。
コンテンツの更新性の面でも、注意が必要だと述べる。まず、アップデートにはApple社の審査が必要だということ。そしてアプリがクライアントサイド側のものであるため、Webのように容易にアプリを更新することができないとし、リリース時のチェックが重要であると語った。
開発プロセス
iPhoneアプリの開発プロセスについても、TiltShift Generatorの実例を交えて解説がなされた。開発プロセスは、プランニング、プロトタイピング、実装、公開の大きく4つのフェーズに分けられるという。
iPhoneアプリ開発のプロセス
プランニングでは、実働前の検証作業を行うことで、更新性の面からも” 根本的な失敗を回避できる” とした。
プロトタイピングでは、要件・機能定義をまとめてモックアップを作り、検証とフィードバックを行う。” UIと機能定義がアプリの成功の半分を握っている” とし、本実装を始める前に検証モデルを制作して、最終的なUIの仕様を決めていくことは重要だとした。このフェーズで深津氏は、ポリシーとして「iPhoneアプリはマニュアルもなく、すぐ使えなければならない。機能が複雑だとあまり使ってもらえない」とし、アプリの目的と使い方を明確にするために、” 機能をどこまで減らせるか?” そして、” 使う可能性のすくない機能はいらない” と語った。事実、氏のアプリは非常に洗練されたUIと使いやすさでとりわけ評価が高く、” 引き算の美学” を感じさせる。
深津氏はUIの実装を考慮する上で、ペーパープロトタイピングを行っているという。ペーパープロトタイピングとは、PhotoshopやIDEによるモックアップを制作せず、紙とペンでプロトタイプを作ることだ。その理由として、氏は” タッチUIはPCでは検証できない” とし、「 PCの画面でデザインしてもそれが有効なデザインかどうかの保証はまったくない」と語った。実際にiPhone画面ぴったりの付箋を貼り付け、ペンでUIを描き使用感を試すことで、使いやすさや不便なところがないかチェックでき、PCでデザインするよりもはるかにスピーディーに検証することができるという。
iPhone画面に付箋を貼り付けたペーパープロトタイピング
iPhoneアプリ実装後の画面
対照的に、実装のフェーズの解説は、プログラムレベルとビジュアルレベルの実装を、” 超がんばる” の一言でまとめた。そのためには、実装に至る前のプロトタイピングまでの段階で、UIの問題点や実装した後で出てくるであろう問題を予め埋めておくことが重要だとした。一通りの実装後、TiltShift Generatorでは、漏洩やライバルに情報が流れることを気にせずベータテストを早い段階で行い、できる限り様々な分野にフィードバックを貰い、今まで拾いきれなかった最終的な問題をできるだけ早く回収・修正できるようにしたという。
公開のフェーズでは、審査、リジェクト、そしてプロモーションについて解説。Apple独特の” 審査” についてのノウハウを惜しみなく紹介した。氏曰く、” アップルに喧嘩を売りすぎない” ことがポイントだという。プロモーションでは、” リリース日のコントロール” の重要性や、” いかに露出を確保するか” 、” App Store依存からの脱却” に着目し、「 僕たちWebの人たちは、その重要性さえ理解していれば、ある程度対策をとることができるのではないか」と語った。
このセッションでは、Flashユーザーがどこに注意してiPhoneアプリ開発に進めばいいか、丁寧に道案内がおこなわれた。そのひとつひとつのプロセスは、非常に考え込まれ目的と理由が明確であり、効果的かつ高効率で無駄がひとつもなく美しい。深津氏が真のプロフェッショナルだと評価される、その所以を垣間見ることができた貴重なセッションだった。
AS3erのためのiPhoneアプリ開発
2人目の登壇者は、深津氏と共にTiltShift Generatorの開発を手がけ、iPhoneのtwitterクライアント NatsuLion for iPhone を開発したことで有名な森琢磨氏だ。フリーランスのプログラマとして活躍中で、iPhoneアプリを開発・コンサルティング・企画と、iPhoneアプリ100%な生活を送っているそうだ。
森琢磨氏
AS3ユーザーのためのObjective-C入門
森氏には、iPhone開発の要となる言語、Objective-Cについてお話を伺った。なじみ深いActionScript 3.0のコードとの比較をした入門講座である。
構文
ActionScript 3.0に比べて、Objective-Cのメソッド呼び出しは非常にユニークだ。.(ドット)と()(パーレン)を使わず、[](ブラケット)を使って呼び出す。氏は、「 ブラケットがすごく多くて(例1 ) 、見た目が気持ち悪いと思った。でも、慣れるしかない」と語る。
実際のコードをAS3と比較
メソッドの引数に関しては、「 引数がある場合は、コロンでつなげてあげるのがポイント。2つ以上ある場合は、withArg2といった形式で繋げていく(例2 ) 。」とした。
例1
[[[AClass alloc] init] autorelease]
例2
ActionScript 3.0: AClass.methodC(arg1, arg2);
Objective-C:[AClass methodC:arg1 withArg2:arg2];
Objective -Cでは、” 変数” と” ポインタ” が特徴的だという。クラスとプリミティブ型が区別されるのがポイントで、intやfloatといったプリミティブ型は、特に問題ないが、オブジェクトの場合は*(アスタリスク)を変数につけ、ポインタとして宣言する必要がある。
例3
ActionScript 3.0 : var instance:AClass;
Objective-C : AClass *instance;
ActionScript 3.0 : var num:int;
Objective-C : int num;
その他には、thisはselfに置き換わること、そして、制御構文(if, switch, while, for等)は同じであること、ルートクラスはNSObjectであることが解説された。
クラス定義に関しては、少々複雑だ。例4 のような場合、Objective-Cでは2つのファイル、.hと.mに分けて記述する。これらはインターフェースと実体をそれぞれ定義するものだが、深津氏の捕捉によれば、「 ActionScript 3.0のインターフェースでは、複数のクラスの通信マナーを統一する使い方が主だったが、それとは別物と考えた方がよく、Objective-Cでは、ひとつのクラスに対して必ず無ければならない」と解説した。
例4
ActionScript 3.0
public class Calc {
public function add(a:int, b:int):int {
return a + b;
}
}
Objective-C
.h
@interface Calc : NSObject
- (int)add:(int)a plus:(int)b;
@end
.m
@implementation Calc
- (int)add:(int)a plus:(int)b {
return a + b;
}
@end
そして重要な概念のひとつとして、イニシャライザとデストラクタについての解説。クラスの初期化時に、イニシャライザとして、initメソッドを呼び出すのが普通であるが、init自体に引数をつけたい場合は、initWithHogeFugaのようなメソッド名になるという。
逆に、クラスの破棄時に呼び出されるデストラクタでは、deallocが実行される。氏によれば、Objective-Cでは、この中で、クラス変数などで保持していたメモリを解放する処理を明示的に書く必要があり、それがActionScript 3.0では自動的に行われているため馴染みがなく、ひとつの大きなハードルになるとし、この” オブジェクトの寿命管理” の仕組みをしっかり理解して使わなければならないと述べ、重要性を説いた。
オブジェクトの寿命管理の話
Objective-Cでは参照カウンタ方式に基づいており、オブジェクトの生成に、alloc(オブジェクトの生成) 、寿命管理に、release(カウンタを1下げる) 、retain(カウンタを1上げる) 、autorelease(カウンタを自動的に1下げるフラグを立てる)計4つのメソッドを使用する。
オブジェクトの寿命管理の4つのメソッド
オブジェクトは、このカウンタを任意に0にしない限り、永遠に存続し続け、メモリを逼迫することになる。「 releaseは忘れやすく、忘れるとメモリの少ないiPhoneの場合、アプリ落ちてしまう」という。この寿命管理は、基本的に必ずreleaseをしなければならないが、一時的にオブジェクトを生成する場合には、autoreleaseを実行することでRunLoopに戻ったときに、releaseが呼び出されるといった処理が可能になるという(例5 ) 。
例5
Calc *calc = [[Calc alloc] init];
[calc add:1 plus:2];
[calc release];
↓
Calc *calc = [[[Calc alloc] init] autorelease];
[calc add:1 plus:2];
便利なautoreleaseだが、オブジェクトが一時的にしか保持されないため、メンバ変数などに長時間保持しておきたい場合にはこの方法は使用できない。そこで、retainを使い、autoreleaseをした状態であっても解放されないように工夫する必要がある。だが、その場合は、保持され続け解放されないため、releaseの実行をしなければならない。
森氏は、これらの寿命管理のベストプラクティスとして、” メンバ変数はdeallocで全部releaseするように書いておく” 、” 一時的なオブジェクトはautoreleaseを必ず付けることでrelease忘れを防げる” 、そしてメンバ変数に代入する場合は、” 自分で明示的に生成したものはそのまま代入、それ以外は必ずretain付きで代入する” ことを挙げた。
フレームワーク
フレームワークについての解説もあった。iPhoneアプリ開発の中核を担う、UIKitフレームワークは、UI周りを司るフレームワークのひとつで、ActionScript 3.0のSpriteに相当するUIViewや、それらのサブクラスであるUIButton, UILabel, UITextFieldがあると紹介した。
このフレームワークの特徴的な点はMVCに特化しているところだ。プログラミング言語として比較的ゆるいActionScript 3.0は意識しない限り、MVCの理解は必要ない。しかし、UIKitフレームワークでは、MVCの考えに基づいて設計されており、厳格にクラスの役目がModel,View,Controllerに分かれている。森氏によれば、「 ControllerはModelおよびViewのオブジェクト
管理し、ModelのデータをViewに反映させる、繋ぐ役割。ViewはModelをまったく意識しない作りにするのが理想的。」と説明した。
フレームワークの解説後、TiltShift Generatorで使われているクラスを紹介。
TiltShift Generatorの例
ライブコーディング
最後に、AppleのIDEであるXCODEで実際にUIKitフレームワークを活用したライブコーディングが行われた。XCODEでのプロジェクト作成、ビルドに必要なクラスのジェネレートからスタートし、解説を交えて簡単なお絵かきアプリを作成した。このライブコーディングで作成した実際のソースは、下記URLにて公開されているので是非参考にしてほしい。
ライブコーディングで作成した絵かきアプリ
かなり濃い内容となったセッションだが、Objective-Cのシンタックスや基本については、ActionScript 3.0に十分な理解があるユーザーであれば、受け入れられる内容だったと思う。むしろ、本やインターネットで説明を読むよりも、大分わかりやすく学ぶことができた。
iPhoneアプリの開発においては、リソースがまだまだ少ない現在、このようなActionScriptユーザーのためのiPhoneアプリ・Objective-C講座はかなり貴重であり、ニッチである。だが、ニッチであったからこそ、ターゲットを絞り込んだセミナーはユーザーに対して大きな価値を生む。来場された方々も、今回のセミナーでiPhoneアプリ開発に対するハードルが下がったのではないだろうか。
(2009/10/8 加茂 雄亮)