iOS4のアプリ終了時の罠

2010/07/15

iOS4になってマルチタスクになりましたが、起動・終了・サスペンドの処理の仕様が変更になっています。

参考本でアプリ終了時(iPhoneのホームボタンで終了時)にデータ保存するサンプルがあるんですけど、その通りコーディングして実行しても、データが保存されません。

もっと詳しく言うと、

(1) viewDidLoadが呼ばれ、NSNotificationCenterのObserverdでapplicationWillTerminateを登録 (2) iPhoneのホームボタンをクリック(アプリ終了ではない) (3) applicationWillTerminateは呼ばれない
※参考本ではapplicationWillTerminateで保存処理を書いている (4) データが保存されない

つうわけで、NSLogでUIApplicationのDelegateメソッドを追ってみました。 ■アプリケーション起動時

(1) didFinishLaunchingWithOptions (2) UIViewController loadVIew (3) UIViewController viewDidLoad (4) UIViewController viewWillAppear (5) UIViewController viewDidAppear (6) applicationDidBicomActive

■ホームボタンクリック

(1) applicationWillResignActive (2) applicationDidEnterBackground

■再度ホームボタンクリック

(1) applicationWillEnterForeground (2) applicationDidBecomeActive

となります。

つまりマルチタスクのiOS4では自動でapplicationWillTerminateが呼ばれない! のでapplicationWillResignActiveかapplicationDidEnterBackgroundに保存処理を書くか・・・。

まぁユーザに明示的に保存させるのが必須ってことですね。 でもさ、でもさ、XcodeでCore Dataプロジェクト作成すると

デフォルトでapplicationWillTerminateにCore Dataの処理が記述されてる(??)

どっちなのApple?・・・まぁ、マルチタスクじゃない方を優先してるんだろうけどw

以前にも書きましたが、やはりマルチタスクは鬼門なのでiOS4 アプリケーションの状態遷移を参考にしてアプリを作っていった方が良いです。

ちなみに、iPhoneのホームボタンをダブルクリックするとバックグランドで待機しているアプリ一覧が表示されます。 これは気づかなかったw
てか、全てのアプリが待機状態になっています。 マルチタスクってのはこういうことだったのか・・・真のマルチタスク(?)じゃないのね。