iOS16時代のLaunch ScreenとInfo.plistとSwiftUI

# はじめに
「部屋とYシャツと私」みたいなタイトルになりましたが、
SwiftUIのみでアプリ開発する時に便利な、Info.plistでLaunch Screenを設定する方法について記載します。
本当はiOS14時代から設定できるようになっていましたが、Xcode14で試してみると他の方の記事の内容と差異があったので、最新手順や調査結果、所感なども記載します。



# まとめ

- 今時のLaunch Screenはカスタマイズして作るものではなくなりました。
Info.plistでLaunch Screenを設定するのであれば、
    - **デフォルト設定のままで良い。(systemBackground背景色のみ)**
    - **設定したとしても背景色のみで十分。**
- iOS16でアップル純正のプリインストールアプリをいくつか調査しましたが、特別なLaunch Screenは設定されておらず、デフォルト設定となっているようです。

## 理由
(黄色い背景がLaunch Screen)
![timeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/abcb962c-e183-2544-154f-d214f3cc1179.png)

**ユーザーにしっかりとメッセージを訴求するのが難しいので、手間をかけてLaunch Screenを作るモチベーションが低い。**

- **0.5秒**程度しか表示されない。
- 画面中央に**固定サイズのアイコンを表示する程度しかできない。**
    - LaunchScreen.storyboardでは可能だった以下の事ができません。
        - 画面解像度に合わせてレイアウトを調整する。
            - 特に画像サイズの調整。
        - iPhone / iPadで表示を変える。
        - Portrait / Landscapeで表示を変える。
        - 初期化処理が終了するまでLaunch Screen表示を継続する。[^1]

```swift:project_name_App.swift
@main
struct project_name_App: App {
    var body: some Scene {
        WindowGroup {      // Launch Screenには手間をかけない。
            ContentView()  // ここ以降の表現をもっと考えた方が良い。
        }
    }
}
```

# 設定方法
## 事前準備

### プロジェクトの作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/471f851a-3b28-34e4-d841-f6f6b38ab298.png" width=380>

Xcode 14にて上記設定でプロジェクトを作成します。


### 画像の設定
画像データを用意します。サイズは320x320ポイント以下にしておきます。(説明は後ほど)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/2989f282-13f7-4874-84b9-12fb0cd51209.png" width=200>
```Assets```に```Image Set```を作成して、名前を設定します。(今回は```LaunchImage```に設定)
![SS2022-10-06 13.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/9c6c4e30-975c-c366-2d57-ba08bc39a5ce.png)
今回は作業を簡略化するために以下の設定にしました。
* ```Scales``` = ```Single Scale``` (＠2x, ＠3x画像を使用しない)
* ```Appearances``` = ```None``` (Dark Mode用画像を使用しない)

### 背景色の設定
```Assets```に```Color Set```を作成して、名前を設定します。(今回は```SystemYellow```に設定)
```Color``` > ```Content```に色を設定します。(今回は```systemYellowColor```に設定)
![SS2022-10-06 13.34.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/5133d686-11ca-78b9-e1ff-faa3c99b88ca.png)



## Info.plistの設定
### Info.plistの場所
Xcode13以降、新規プロジェクトでInfo.plistが生成されなくなりました。
```TARGETS``` > ```Info``` > ```Custom iOS Target Properties```これがInfo.plist相当です。
![aaaaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/3f417835-a107-b56e-f78a-584a27b27e53.png)


### UILaunchScreenの削除
```Launch Screen```を開くと、その下に```UILaunchScreen```が設定されていますが、これを削除します。
![SS0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/9caf95d1-896b-de60-9613-9c04de816a00.png)



### Image Nameの設定
```Launch Screen```の(+)ボタンを押します。
![202022-10-05_14.04.58-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/90bb718e-e857-de99-b121-b67aa751ef2d.png)
メニューが出てくるので```Image Name```を選択します。
![202022-10-05_14.05.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/81fbf3f9-39de-279f-d6fc-319de559b09e.png)
「画像の設定」で作成した「```LaunchImage```」を```Value```に設定します。
![2022-10-06_11.02.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/e6e1d7f3-46a7-f8f9-7e3c-1f9a754ec7db.png)


### Background colorの設定
```Image Name```の下に```Background color```を追加して、「背景色の設定」で作成した「```SystemYellow```」を```Value```に設定します。
![2022-10-05 21.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/cbcdb27c-777b-93c0-6267-bb3d4912609b.png)

## 完成
ビルドして実行すればLaunch Screenが表示されるはずです。

## Tips
Launch ScreenはOSにキャッシュされますので、開発中にLauncn Screenを変更したら端末を再起動することをお薦めします。(SimulatorはDevice > Restart)
何もしないと、古いLaunch Screenが表示されてしまい、しばらく悩むことになります。:fearful:


# 解説

## 画像サイズ
画像サイズは、(幅 x 高さ)：**320 x 320 ポイント以下**にすることをお薦めします。
(理由は下記参照)

### 実験
以下の画像を用意しました。
```iPhone 14 Pro```で画面いっぱいに表示されるサイズです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/b51375c5-0f54-36ae-0b8b-842103f85195.png" width=160>


### 結果
| 機種 | キャプチャー | 解像度(ポイント) |
|:---:|:---:|:---:|
| iPhone SE (1st) | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/673e4483-c0c6-edce-3bbb-8ca8243f7776.png" width=200> | 320 x 568 |
| iPhone 14 Pro Max | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/0f863f30-ba62-3f6d-75e4-e1ac80e1eee0.png" width=200> | 428 x 926 |


- 端末の画面サイズに合わせて画像をリサイズしてくれることはなく、そのままのサイズで表示される。
- 表示位置は画面中央になる。
- よって、画像サイズが不適切な場合
    - 画面が小さい端末：画像の中央部分しか表示されない。
    - 画面が大きい端末：画像の周囲に隙間ができる。

### 考察
* 画像サイズは、現状で画面が一番小さいiPhone SE (1st)の画面幅(320ポイント)に合わせておけば、画像表示が欠ける心配をしなくて済みます。
* 端末の回転も考慮すると、幅と高さを同じにしておけば良いと思います。
* かつての```LaunchImage```のように画像を全画面表示することは諦めて、アイコンとして表示することを考えた方が良いと思います。


## 画像の回転

```Deployment Info``` > ```Orientation```を設定してあれば、端末の向きに応じて画像が回転します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/99e911a0-e951-f0f7-8753-1ac230441c7f.png" width=400>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/7447ffbc-17dc-a9c7-61e4-2141a8b163ea.png" width=400>



## 画像の複数表示
```Image Name```を複数設定しようとしても、```Image Name```が既に設定されている旨のアラートが表示されるので、複数の画像を表示することはできません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/48d58511-2cd2-df4e-0429-2452bd0f279a.png" width=280>





# Development Environment
* Xcode 14.1 beta 3
* iOS 16.1 beta 4 - iOS 15.0


# 所感 (ポエム)
- 近年のスマホの高性能化
    - 複数のアプリを起動したままにしておいても十分なメモリ量が搭載されるようになった。
    - よく使うアプリをApp Switcherで切り替えて使用するケースをよく見るので**Launch Screenが露出する機会は少なくなっていると感じる。**

- アプリを起動してから操作可能になるまでの表現のトレンド
    - 今まで
        - Launch Screenのような静止状態でユーザーを待たせる。(ストレスフル:angry:)
    - これから
        - **”新たな表現”でストレスを感じさせない工夫が求められていると感じる。**
(または、**起動シーケンスの改善によって一瞬でアプリが起動したように感じさせる**)

        - “新たな表現”の例
            - redacted Modifier
            - アニメーション
            - フェードイン
            - サウンド再生
            - バイブレーション
- つまり
現状に満足せず、良いアプリを作るために改善を続けていきましょう。:muscle:


# ご注意
ここに記載された内容は個人的な感想や見解ばかりであり、Apple社などの推奨や見解ではありません。
[^1]:[LaunchScreenを表示したままにしてViewControllerを動かす](https://qiita.com/Hackenbacker/items/8abcdbb77c42f3670749)