« iPhone Multitasking Fast App Switchingを無効化する | メイン | iOS 4に対応してみる - Retinaディスプレイアイコン編 »

iOS 4に対応してみる - マルチタスク編

当初は完全にiOS 4のマルチタスク化を諦めていたのだが,使い込んでいくうちに対応している場合とそうでない場合とで結構な体感スピードの差があることに気づいた。
ということで,ある程度真剣に対応してみた。
※ここではiOS 4以上のみではなく3.X台もきちんとサポートする前提。

まずはアプリケーションのライフサイクルに対応する。
ライフサイクルはアプリの大元締めであるUIApplicationDelegateと各UIViewControllerで呼び出される各メソッドで対応する。
UIApplicationDelegateの場合には,以下のような感じだ。

・application::didFinishLaunchingWithOptions
 以前よりお馴染み。アプリケーションがまさに起動した時に呼ばれる。
・applicationDidEnterBackground:
 iOS 4から導入された。バックグランドになると呼び出される。
・applicationWillEnterForeground:
 これもiOS 4から。フォアグラウンドつまりバックグランドから復帰する前に呼ばれる。
・applicationWillTerminate
 今までも使えてたメソッド。アプリケーションが終了しようとする時に呼ばれる。

あとはアプリケーションのアクティブになるならないでapplicationWillResignActiveやapplicationDidBecomeActiveも使うことはできる。
UIApplicationDelegateでの処理なので個人的には大きな処理を入れていない。これらのメソッドを実装しても単純に呼び出されないだけなので,Ver.3.2以前でも問題なく動作する。

さて各UIViewControllerでの対応だが今まではloadView/viewDidLoad/viewWillAppear/viewDidAppear/viewWillDisappear/viewDidDisappearなどViewとしてのライフサイクルで対応していたのがほとんどだが,ちゃんとアプリケーションのライフサイクルに対応する必要がある。
そんな時はNSNotificationを使えばよい。以下のようなコードをviewDidLoadにでも書いてselectorなメソッドを実装すれば上記のUIApplicationDelegateで発生していた各イベントをView側でも受け取ることができるようになる。

if (&UIApplicationDidEnterBackgroundNotification) {
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(appDidEnterBackground:)
        name:UIApplicationDidEnterBackgroundNotification
        object:[UIApplication sharedApplication]];
}

ここで3.Xも同時に対応する場合にはif文が重要。特にBackground/ForegroundはiOS 4以降のみ対応しているので,ビルド時には問題ないけども動かすとたぶんクラッシュするはず。

基本的にはこれでライフサイクル対応はできたので,アプリケーションの各Viewの状態からBackgroundに遷移させてどうなるかその後にForegroundにして問題ないかをチェックしていけば問題ない。個人的にはまったのはAlertView表示中にBackgroundになった場合だったりしたので,細かい部分も忘れずに。

« iPhone Multitasking Fast App Switchingを無効化する | メイン | iOS 4に対応してみる - Retinaディスプレイアイコン編 »

トラックバック

このエントリーのトラックバックURL:
http://blog.bluetune.net/cgi/mt-tb.cgi/378

コメントを投稿

$MTProductName version=

tokyobuddha

Powered by FeedBurner

クリエイティブ・コモンズ・ライセンス