これまでのiOS 3.x用アプリをiOS 4.0用に拡張中。iOS4.0ベータが出たころにはまったく手をつける余裕がなく、実際に着手したのは本当に最近。。。
まずはマルチタスク対応から。
マルチタスクと言っても対応中のアプリはバックグラウンドで動作することはなく、ただひたすらsuspendしているだけ。それでも、データ保存のタイミングやメモリ解法、復帰時の処理などなどいくつかケアしなくてはならないことがある。うかつにSDK4.0でビルドだけして公開すると、ユーザーデータの保存タイミングを逃したり、パスワード情報など見せてはいけないものを画面に表示してしまったり、大きな問題になりかねない。怖い怖い。ということで、まずはじっくりお勉強。
今回のマルチタスク対応にあたり、資料がかなり充実していて助かった。
おすすめなのはWWDCのセッション105
何はともあれこれを見るべきだと思う。1時間でここまで理解が深められるソースはなかなかないだろうから。
ついでにkeynoteのPDF版もダウンロードしておくこと何かと役に立つ。話の中にブロック図やメソッド名などが出てくるのだけど、もちろん一度見ただけで全部なんて覚えられない。そんなときにはPDF版の出番となる。ビデオはここからダウンロードできる。
ほかにもかなり充実した資料たち。簡単にまとめておこう。私はこんな感じで順を追って格闘中!
基本概念&最低限の対応
WWDC Session 105 – Adopting Multitasking on iPhone OS, Part 1
Part 1は、基本概念と最低限やるべきこと(バックグラウンドではsuspendしているだけのアプリでもケアすべきこと)がわかりやすく説明されている。
マルチタスクと言っても全アプリが常に同時にrunしているようなシステムではない。まず、iOSの「マルチタスク」が何を意味しているものか明確に把握しておく必要がある。
iPhone Application Programming Guide
きっとだいたい人が最初に読むであろうこのドキュメント。基本中の基本だけど、OSの進化に合わせて改訂されているのでその都度きちんと確認したい。
このなかの以下の章がものすごくわかりやすい。
Understanding an Application’s States and Transitions
マルチタスク対応デバイスとそうでないデバイスでライフサイクルが変わる。ここは理解しておかないと下位互換の保持も難しくなるだろう。まずは、今回から加わったバックグラウンドの2ステートも合わせた5つのステート (Not running, Foreground/Inactive, Foreground/Active, Background/Running, Background/Suspended) についての説明があり、さらに、各イベント発生時にコールされるデリゲートメソッドなども合わせて説明されている。これは非常にわかりやすい。図で説明されているので一目見るだけでもかなり理解度がアップする。
Multitasking
バックグラウンドとフォアグラウンドを行き来する際の実装方法と注意点がまとめられている。Notificationの扱い方や、バックグラウンドで待機(または動作)中にLocaleが変更された場合の処理方法など。
この章の最初のチェックリストを見てもわかるように、バックグラウンドでsuspendしているだけのアプリでもケアすべきことは結構ある。
UIApplicationDelegate Protocol Reference
バックグラウンド/フォアグラウンドの行き来やイベント発生時の処理をするために欠かせないのがUIApplicationDelegate。リファレンスガイドもiOS4.0用に変更されているので、各デリゲートの詳細についてはこちらも参考にするとよい。iOS4.0対応時の注意なども載っている。
バックグラウンドでの動作
WWDC Session 109 – Adopting Multitasking on iPhone OS, Part 2
Part 2では、アプリをバックグラウンド動作させるための方法、注意点等が説明されている。が、今のところ対応予定はないのでまだ最初の数分しか見ていない。バックグラウンド動作を必要とするのであればぜひ見た方がいいと思う。
Executing Code in the Background (iPhone Application Programming Guide)
実際にバックグラウンド動作させる方法。まだ読んでいない。。
おまけ
どうしてもバックグラウンドで動作も待機もさせたくない場合は、バックグラウンドに入ったらすぐに終了させるというオプションがある。これは本来あるべき姿ではないと思うけれど、どうやってもマルチタスク対応が厳しい場合には最悪このオプションを使えばよい。
info.plistにUIApplicationExitsOnSuspendを追加して値をYESにする。
参照:Opting Out of Background Execution
最後に
ドキュメントの章立てなどを見てもわかるが、「マルチタスク対応」と「バックグラウンド動作対応」は意味が違う。
「マルチタスク対応」が意味するのは、あくまでも「マルチタスクOS対応」であり、バックグラウンドでの動作が不要な場合でも必ずする必要がある。
さぁ、がんばろう!
今後少しずつ、上記ドキュメントの内容もまとめて行く予定(そうしないとどうせ忘れるし・・・)。
他にもこれは必読!というようなドキュメントをご存知の方、教えていただけると嬉しいです。その他、質問などなどはツイッター(@natsun_happy)で。


