applicationWillEnterForeground対applicationDidBecomeActive、applicationWillResignActive対applicationDidEnterBackground


215

アプリケーションがバックグラウンドにあることからウェイクアップしていて、アプリケーションをアクティブにする準備をしたい場合に実装する適切なデリゲートはどれですか?

applicationWillEnterForeground対applicationDidBecomeActive-違いは何ですか?

アプリケーションがスリープ状態になり、データをクリーンアップして保存する準備をしたいときに実装する適切なデリゲートはどれですか。

applicationWillResignActive対applicationDidEnterBackground-違いは何ですか?

また、着信SMSまたは通話が着信したときにapplicationWillResignActiveが呼び出されますが、ユーザーが[OK]をクリックして続行することを選択したことにも気付きました。このような場合、アプリでアクションを実行したくありません。ユーザーがアプリを終了しなかったため、中間的なクリーンアップを行わずに実行を継続したいだけです。したがって、applicationDidEnterBackgroundだけでクリーンアップ作業を行う方が理にかなっていると思います。

起床してスリープ状態にするために実装するデリゲートを選択し、SMS /通話によって中断されるようなイベントを検討する際に従うべきベストプラクティスについてのご意見をお待ちしています。

ありがとう

回答:


449

ウェイクアップするとき、つまりアプリを再起動するとき(スプリングボード、アプリ切り替え、またはURLのいずれかを介して)applicationWillEnterForeground:が呼び出されます。アプリがバックグラウンドに置かれた後、使用可能になったときに1回だけ実行されますが、applicationDidBecomeActive:起動後に複数回呼び出される場合があります。これはapplicationWillEnterForeground:、再起動後に一度だけ実行する必要があるセットアップに最適です。

applicationWillEnterForeground: と呼ばれます:

  • アプリが再起動されたとき
  • applicationDidBecomeActive:

applicationDidBecomeActive: と呼ばれます:

  • アプリが最初に起動されたとき application:didFinishLaunchingWithOptions:
  • 後にapplicationWillEnterForeground:処理するために、何のURLがない場合。
  • 後でapplication:handleOpenURL:呼び出されます。
  • applicationWillResignActive:ユーザーが電話やSMSなどの割り込みを無視した場合。

applicationWillResignActive: と呼ばれます:

  • 電話のような中断があるとき。
    • ユーザーが電話を取る場合にapplicationDidEnterBackground:呼び出されます。
    • ユーザーが呼び出しを無視した場合にapplicationDidBecomeActive:呼び出されます。
  • ホームボタンが押されたとき、またはユーザーがアプリを切り替えたとき。
  • ドキュメントはあなたがすべきだと言います
    • 進行中のタスクを一時停止する
    • タイマーを無効にする
    • ゲームを一時停止する
    • OpenGLフレームレートを下げる

applicationDidEnterBackground: と呼ばれます:

  • applicationWillResignActive:
  • ドキュメントはあなたがすべきだと言います:
    • 共有リソースを解放する
    • ユーザーデータを保存する
    • タイマーを無効にする
    • アプリが終了した場合に復元できるように、アプリの状態を保存します。
    • UI更新を無効にする
  • 5秒以内に必要なことを行い、メソッドを返します
    • 5秒以内に戻らない場合、アプリは終了します。
    • より多くの時間を求めることができます beginBackgroundTaskWithExpirationHandler:

公式ドキュメント。


10
もう1つ追加します。アプリからバックグラウンドアプリリストを開き(ホームボタンをダブルクリック)してから、それに戻る(アプリのプレビューを選択する)場合- -applicationWillEnterForeground:呼び出されないだけです-applicationDidEnterBackground:(iOSが再起動であるとは考えていないとします)。
kpower 2014

@kpowerはい、それは私の首を骨折しただけです...その場合、willEnterForegroundが呼び出されないとは思いもしませんでした...
TheEye

applicationWillEnterForeground:バックグラウンドからフォアグラウンドまで毎回呼び出されるのではないでしょうか!applicationDidBecomeActiveあとで呼ばれなかった件が見つかりません。
Desmond DAI 2017年

これは正確ではありません。applicationWillResignActiveはapplicationDidEnterBackgroundなしで呼び出すことができます
MichaelGofron 2017年

27

アプリのライフサイクルの管理は、質問に役立ちます。簡単な概念については、そのドキュメントの図を参照してください。XCodeウィザードで生成されたコードからコメントを読むこともできます。次のようにリストされています:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    return YES;
}

- (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.
     */
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    /*
     Use this method to release shared resources, save user data, invalidate 
     timers, and store enough application state information to restore your 
     application to its current state in case it is terminated later. 
     If your application supports background execution, this method is called 
     instead of applicationWillTerminate: when the user quits.
     */
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    /*
     Called as part of the transition from the background to the active state; 
     here you can undo many of the changes made on entering the background.
     */
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    /*
     Restart any tasks that were paused (or not yet started) while the 
     application was inactive. If the application was previously in the 
     background, optionally refresh the user interface.
     */
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    /*
     Called when the application is about to terminate.
     Save data if appropriate.
     See also applicationDidEnterBackground:.
     */
}

詳細については、UIApplicationDelegateの公式ドキュメントを参照してください


リンクが切れています。
Phlippie Bosman

今のところ、2019年にいくつかの説明とリンクを改訂します。
tomjpsun

13

私はまだDanoの答えに少し混乱していたので、参照用に特定のシナリオでイベントのフローを取得するために少しテストを行いましたが、それもあなたにとって役立つかもしれません。これはUIApplicationExitsOnSuspend、info.plistで使用しないアプリ用です。これは、iOS 8シミュレータで実行され、iOS 7デバイスで確認されました。Xamarinのイベントハンドラー名を許しません。それらは非常に似ています。

  • 実行されていない状態からの初回および以降のすべての起動:

終了しました

OnActivated

  • 中断(電話、上部のスライドダウン、下部のスライドアップ):
  • ホームボタンをダブルクリックして、非アクティブなアプリを一覧表示し、アプリを再選択します。

OnResignActivation


OnActivated

  • ホームボタンをダブルクリックして、非アクティブなアプリの一覧を表示し、別のアプリを選択して、アプリを再起動します。
  • ホームボタンを1回押してから再起動します。
  • ロック(オン/オフボタン)、次にロック解除:

OnResignActivation

DidEnterBackground


WillEnterForeground

OnActivated

  • ホームボタンを2回押して、アプリを終了します(その後の再起動が最初のケースです)。

OnResignActivation

DidEnterBackground

DidEnterBackground(iOS 7のみ?)

はい、DidEnterBackgroundiOS7デバイスで2回呼び出されます。どちらの場合も、UIApplicationの状態はBackgroundです。ただし、iOS 8シミュレーターはそうではありません。これにはiOS 8デバイスでのテストが必要です。私はそれを手にしたとき、または誰かが確認できたときに、私の答えを更新します。


9

applicationWillEnterForeground と呼ばれます:

アプリが再起動されたとき(バックグラウンドからフォアグラウンドに移動)このメソッドは、アプリが最初に起動したとき、つまり、applicationDidFinishLaunchが呼び出されたときではなく、バックグラウンドからのときのみ呼び出されます applicationDidBecomeActive

applicationDidBecomeActive 呼ばれる

処理するURLがない場合に、アプリが最初に起動されdidFinishLaunching たときapplicationWillEnterForeground。後でapplication:handleOpenURL:呼び出されます。applicationWillResignActiveユーザーが電話やSMSなどの割り込みを無視した場合。アプリケーションからどこかにalertViewが消えた後


これがiOS 7の時点で変更されたかどうかを知っていますか?私は(間違っている可能性があります)applicationWillEnterForegroundで(iOS 5/6)を実行し、アプリが最初に起動したときにそれを実行したことを覚えています。現在のところ、7.1 / 8では、あなたは正しいです。applicationWillEnterForegroundは起動時に呼び出されません。
キム・ジニョン、2015


5

iOS 8以降では、電話を取る際に微妙ですが重要な違いがあります。

iOS 7では、ユーザーが電話をかけると、applicationWillResignActive:とapplicationDidEnterBackground:の両方が呼び出されます。ただし、iOS 8以降では、applicationWillResignActive:のみが呼び出されます。


1

iOS 13以降では、次のメソッドが実行されます。

- (void)sceneWillEnterForeground:(UIScene *)scene
- (void)sceneDidBecomeActive:(UIScene *)scene
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.