

iOSアプリで、ホームボタンを２回押してマルチタスクバーを表示させ、当該アプリを上にスワイプして終了するのですが、これはiOSアプリのライフサイクルにおける「NotRunning」状態に相当するのでしょうか。

今自分が作っているアプリで、iOS端末実機を起動してからアプリを起動する（こちらはNotRunnning状態からスタートするので間違いないですよね）のと、上記のようにマルチタスクバーから終了させて再度起動するのでは異なる動きをしています。

単なる知識不足なだけかと思いますが、是非ご教示いただければと思います。

* * *

> 異なる動きというのは具体的にどういったものでしょうか。

→終了前に操作していた画面を保存し、復帰時に復元するようにしているのですが、マルチタスクバーからの終了からの再起動だと復元されず、最初の画面が表示されてしまいます。

* * *

> もし - application:shouldSaveApplicationState:
> などで有効にする、アプリ状態の保存／復元機能を使われているのでしたら、マルチタスクバーからの強制終了で保存した状態が破棄されるのは、安全策のための仕様のようです：

→まさにご指摘の通りのことを行っていました。  
仕様だということで理解しました、ありがとうございます。

* * *

> 質問の場合を考えると、 どちらも結局は Not Running の状態となりますが、…
>
> ユーザー操作による終了は suspended なアプリを終了させるのと同じ：

→結果的には今回の私のアプリの問題とズレた質問になってしまい申し訳ありません、  
ライフサイクルの知識として1つ理解できました。


CC BY-SA 3.0
2015-02-20T06:24:45.683
6824
2015-02-22T09:13:19.917
2015-02-22T09:13:19.917
8438
8438
question
ios iphone
iOS アプリのライフサイクルについて


  * [App Programming Guide for iOS](https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html#//apple_ref/doc/uid/TP40007072-CH2-SW3)
  * [UIApplicationDelegate](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/)

Apple ドキュメントの画像の複製ができませんので、以下にアプリの実行状態をまとめてみました。

* * *

## iOS アプリの実行状態

![iOS7 App - Life cycle](https://i.stack.imgur.com/8lqWp.png)

## 状態移行の際に呼ばれるメソッド

  * 起動 (Launch) 
    * `application:willFinishLaunchingWithOptions` / `application:didFinishLaunchingWithOptions`
  * Foreground へ移行 
    * `applicationDidBecomeActive`
  * Background へ移行 
    * `applicationDidEnterBackground`
  * Inactive へ移行 
    * `applicationWillResignActive` (Foreground から移行する時) / `applicationWillEnterForeground` (Background から移行する時)
  * 終了 (Terminate) 
    * `applicationWillTerminate`   
(但し、Suspended 状態、もしくはデバイス再起動時には、呼ばれない)

* * *

質問の場合を考えると、 どちらも結局は Not Running の状態となりますが、 Terminate
時の状態遷移で呼び出されるメソッドが異なってきます。 以下の (3.) が問題の動作と考えられます。

  1. Foreground 実行中から Terminate  
→`applicationWillResignActive`→`applicationWillTerminate`

  2. アプリがバックグラウンドに送られ Background 状態になって Terminate  
→`applicationWillResignActive`→`applicationDidEnterBackground`→`applicationWillTerminate`

  3. アプリがバックグラウンドに送られ、停止状態(Suspended)になって Terminate  
→`applicationWillResignActive`→`applicationDidEnterBackground`

終了時にアプリケーションが Suspended 状態にあるかどうかで、
[`applicationWillTerminate`](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/applicationWillTerminate:)
による通知の有無が変わります。 アプリケーションをバックグラウンドに送る場合、アプリケーションの終了を正確に取られるチャンスは
`applicationDidEnterBackground` が最後になりそうなので、そのタイミングか
`applicationWillResignActive` にて、操作画面の保存処理を行っておくべきでしょう。


CC BY-SA 3.0
2015-02-20T08:50:35.727
6831
2015-02-20T09:50:39.243
2015-02-20T09:50:39.243
4978
4978
6824
answer


ユーザー操作による終了は suspended なアプリを終了させるのと同じ：

> User-initiated termination has the same effect as terminating a suspended
> app.

[App
Termination](https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html#//apple_ref/doc/uid/TP40007072-CH2-SW7)

とあり、Suspended の次の状態は Not running（[Execution States for
Apps](https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html#//apple_ref/doc/uid/TP40007072-CH2-SW3)）ですから、マルチタスクバーから終了した後の起動は、Not
running 状態からスタートすると考えていいのではないかと思います。

* * *

もし `\- application:shouldSaveApplicationState:`
などで有効にする、アプリ状態の保存／復元機能を使われているのでしたら、マルチタスクバーからの強制終了で保存した状態が破棄されるのは、安全策のための仕様のようです：

> Deleting the preserved state information when the app is killed is a safety
> precaution.

[Tips for Saving and Restoring State
Information](https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforImplementingYourApp/StrategiesforImplementingYourApp.html#//apple_ref/doc/uid/TP40007072-CH5-SW41)


CC BY-SA 3.0
2015-02-21T10:55:17.333
6863
2015-02-21T10:55:17.333
2299
6824
answer