ユーザーが iPhone でアプリケーションを強制終了したときに最後のアクションを実行する方法はありますか?
UIApplicationDelegate には applicationWillTerminate: がありますが、私が理解しているように、アプリケーションの終了時に呼び出されることは保証されていません。別の方法はありますか?
呼び出されることに頼ることはできませんapplicationWillTerminate
。ドキュメントから:
バックグラウンド実行をサポートしていないアプリ、または iOS 3.x 以前にリンクされているアプリの場合、このメソッドは、ユーザーがアプリを終了するときに常に呼び出されます。バックグラウンド実行をサポートするアプリの場合、通常、ユーザーがアプリを終了してもこのメソッドは呼び出されません。その場合、アプリは単にバックグラウンドに移行するためです。ただし、このメソッドは、アプリがバックグラウンドで (中断されずに) 実行されており、システムが何らかの理由でアプリを終了する必要がある場合に呼び出すことができます。
状態を保存する適切な場所は、アプリがバックグラウンドに入るときです。これが発生すると、アプリがフォアグラウンドに戻るか、強制終了されて最初から開始されるかを知る方法はありません。
状態を保存する「正しい」場所は、との両方 -applicationDidEnterBackground:
にあり-applicationWillTerminate:
ます。二重保存について心配する必要はありません。通常、呼び出されるのはそのうちの1つだけです(IME-applicationWillTerminate:
は、アプリがバックグラウンドで強制終了されたときに呼び出されません)。
警告:アプリがバックグラウンドに入った後に呼び出されるため、呼び出される保証-applicationDidEnterBackground:
はありません(したがって、通知なしに強制終了の対象になります!)。アプリがバックグラウンドで実行されているときにデバイスのメモリが不足している場合、デバイスが強制終了される可能性があります。これを回避する最善の方法は、そもそもメモリを使いすぎないことです。
を使用することもできます
-applicationWillResignActive:
が、これはお勧めしません。アプリは頻繁に非アクティブになります。明らかなのは、システムダイアログ(場所/プライバシープロンプト、Wi-Fi、アラートとして表示される通知、アラーム)、TWTweetSheetであり、MFMailComposeViewController、MFMessageComposeViewController、通知センター、アプリスイッチャーバー(トラックの変更/方向ロックの有効化など)が疑われます)。
プロジェクトテンプレートの1つを使用すると、アプリの状態に関するすべてのメソッドがAppDelegateに含まれます。
コードをapplicationWillResignActive:
メソッドに入れます。アプリが非アクティブ状態(終了または終了)になると呼び出されます。
- (void)applicationWillResignActive:(UIApplication *)application
{
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
appdelegate で applicationWillResignActive メソッドを使用するか、何かを保存したい場合は次のことを実行できますが、何らかの理由でアプリデリゲートでそれを実行したくない場合:
- (void) viewDidLoad/init {
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(myApplicationWillResign)
name:UIApplicationWillResignActiveNotification
object:NULL];
}
- (void) myApplicationWillResign {
NSLog(@"About to die, perform last actions");
}