NewImage

タイトルのようなサンプルアプリを書いた。

単純に起動時にカウントアップをすれば、起動した回数を数えられる。
今回は、バックグラウンドからの復帰した場合にもカウントを増やすようにしたので、


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
	// カウントアップ
	[[CountManager sharedManager] countUp];
	// ...
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
    [[CountManager sharedManager] saveCount];
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    [[CountManager sharedManager] countUp];
    [self.viewController updateOutlets];
}

という感じにしました。

最初は、スリープからの復帰をカウントアップから除外しようと思いましたが、IOS5のライフサイクルが変更されてそれが難しそうだったので諦めました。

本当に起動時のみ(バックグラウンドの復帰は含めない場合)はdidFinishLaunchingWithOptionsだけにカウントアップを入れればいいと思います。

CountManagerのシングルトンで起動中のcount数を保持して、バックグラウンドに行く時 or 終了時に値を保存するような感じにしています。(これが最適解という自信はないですが…)

後、書いてて地味に引っかかったのが、applicationDidEnterBackground内でNSUserDefaultsを使って値を保存していますが、
iOS5だと[defaults synchronize];をしなくても保存が完了しますが、iOS4だと保存が完了してくれません。(バックグラウンドからアプリを除去すると保存する前にアプリが終了します)
applicationDidEnterBackground内で保存処理をするときはちゃんと[defaults synchronize];とという感じで同期的にやったほうがよさそうです。

iOSはライフサイクルが地味に変更されたりするので、あまり現状のiOSのライフサイクルの処理順に依存したコードは書かないほうがいいと思います。

Post Navigation