iOSアプリのライフサイクル

# はじめに
iosでAppDelegateのメソッドがどんな時に呼ばれるかを知りたかったので、
Appleの[資料](https://developer.apple.com/documentation/uikit/app_and_scenes/managing_your_app_s_life_cycle)の確認と、アプリを実装して確認しました。

# 実装した環境
- Xcode 10.2.1
- SWIFT 5
- ios 12

# アプリライフサイクルと呼ばれるメソッド
## アプリライフサイクル
下の図は、アプリライフサイクルとそれぞれの遷移時にAppDelegateで呼ばれるメソッドです。

<img width="700" alt="20190606-ios-lifecycle.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/0c50ed72-c71f-f14d-e964-cdc97d52cada.png">


## アプリの起動時
アプリを最初のタップして、起動した時のAppDelegateの呼ばれる順番です。

- func application(_:willFinishLaunchingWithOptions)
- func application(_:didFinishLaunchingWithOptions:)
- func applicationDidBecomeActive(UIApplication)

## アプリをバックグランドへ
アプリをバックグランドに移した時のAppDelegateの呼ばれる順番です。

- func applicationWillResignActive(UIApplication)
- func applicationDidEnterBackground(UIApplication)

## アプリがバックグランドの状態でアプリアイコンを押す
アプリがバックグランド状態で、アプリアイコンを押すと、アプリがフォアグランドに遷移します。この時のAppDelegateの呼ばれる順番です。

- func applicationWillEnterForeground(UIApplication)
- func applicationDidBecomeActive(UIApplication)

## アプリの終了時
アプリ終了時にAppDelegateの呼ばれる順番です。

- func applicationWillResignActive(UIApplication)
- func applicationDidEnterBackground(UIApplication)
- func applicationWillTerminate(UIApplication)

## UniversalLinkで起動した場合
### アプリ未起動時 (Not Running)
アプリが起動されていない状態(Not Running)の時に、universal linkでアプリが起動した時のAppDelegateのメソッドの呼ばれる順番です。

- func application(_:willFinishLaunchingWithOptions)
- func application(_:didFinishLaunchingWithOptions:)
- func application(_:continue:restorationHandler:)
- func applicationDidBecomeActive(UIApplication)

### アプリバックグランド時(Background)
アプリがバックグランドの状態(Background)の時に、universal linkでアプリが起動した時のAppDelegateのメソッドの呼ばれる順番です。

- func applicationWillEnterForeground(UIApplication)
- func application(_:continue:restorationHandler:)
- func applicationDidBecomeActive(UIApplication)

## 通知をタップして起動した場合
### アプリ未起動時 (Not Running)
アプリが起動されていない状態(Not Running)の時に、通知からアプリが起動した時のAppDelegateのメソッドの呼ばれる順番です。

- func application(_:willFinishLaunchingWithOptions)
- func application(_:didFinishLaunchingWithOptions:)
- func userNotificationCenter(_:didReceive:withCompletionHandler:)
- func applicationDidBecomeActive(UIApplication)

### アプリバックグランド時(Background)
アプリがバックグランドの状態(Background)の時に、通知からアプリが起動した時のAppDelegateのメソッドの呼ばれる順番です。

- func applicationWillEnterForeground(UIApplication)
- func userNotificationCenter(_:didReceive:withCompletionHandler:)
- func applicationDidBecomeActive(UIApplication)

### アプリ起動時(Foreground)
アプリがフォアグランドの状態(Foreground)の時に、通知をタップした時には、以下のメソッドが呼ばれます。
userNotificationCenter(_:willPresent:withCompletionHandler:)

# アプリの現在の状態の取得方法
アプリの現在の状態は、`UIApplication.shared.applicationState`で取得できます。状態は、[`UIApplication.State`](https://developer.apple.com/documentation/uikit/uiapplication/state)で定義されている`active`、`inactive`、`background`の3つです。

# 参考文献
- [Managing Your App's Life Cycle](https://developer.apple.com/documentation/uikit/app_and_scenes/managing_your_app_s_life_cycle)
- [Appleリファレンス application(_:continue:restorationHandler:)](
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application)
- [Appleリファレンス UIApplication](
https://developer.apple.com/documentation/uikit/uiapplication)
- [Appleリファレンス UIApplication.State](
https://developer.apple.com/documentation/uikit/uiapplication/state)