iOSエンジニア見習いがUIKitのドキュメントを読んでみた。Part2

# 読むところ
[About App Development with UIKit](https://developer.apple.com/documentation/uikit/about_app_development_with_uikit)

## お願い

初心者なりの解釈を多数書いているので、もし指摘事項ありましたらお気軽にコメントでいただけると幸いです。（むしろそのためにQiitaに投稿しているので）


# ドキュメントを読んで得た新しい学び

- App Bundleという概念の存在
- App BundleにStoryBoardファイルが入っていること
- `LaunchScreen.storyboard`はアプリが準備中のときにだけ立ち上がるようになっている（かも）
- `Info.plist`のplistはプロパティリストの略である
- UIKitにはMVCを始めとする数々の設計思想がある。

# （補足）ドキュメントメモ
## Overview

Xcodeがアプリのビルドをするときに、App Bundleというものが作成されるようです。Bundle IDなど度々Bundleという言葉が登場していたのでそれのことなのでしょうか。そもそもApp Bundleという抽象的な位置づけを理解する必要がありそうです。

App Bundleはアプリに関連付けられたResourceというものと、コードを含んだ構造化されたディレクトリで、いわゆるXcodeのProject Navigatorに出ている構造がそのまま反映されているのだと思います。App Bundleの構造はXcodeがよしなに処理してくれるので気にしなくてもよさそうです。（逆にログから読み解くときは必要になるということなのかもしれません。）

Resourceは下記を含んでいます。

- Image Assets
- StoryBoardファイル
- 文字列ファイル
- アプリのメタデータ

StoryBoardのファイルはApp Bundleにそのまま保存されているのでしょうか。あまりそういうイメージがなかったので少し驚きました。（Xcodeがビルドしている段階でバイナリに変換されているものだとてっきり思っていました。）

アプリのメタデータは`Info.plist`も該当するのでしょうか。

## Required Resources

App iconsとLaunch screen storyboardは必須のリソースだそうです。

あまり重要ではないですが、誤ってAssetsの中にあるApp iconを削除してしまったとき、ビルドできなくて怒られたことを思い出しました。

### App icons

App iconsはホームスクリーンだけではなく、設定アイコンと他のアプリで起動するときに表示できるようですね。

App iconで気にすべきところは

- 複数の場所にアイコンが設置されること
- 複数のデバイスにアイコンが設置されること
- 複数のアプリアイコン

ですね。凝ったユーザー体験を提供しようとするとこれらのことを気にしたほうがよさそうです。

### Launch screen storyboard

`LaunchScreen.storyboard`は下記の目的で使用されます。

- 初期のUI
- スプラッシュスクリーン
- 実際のUIの簡易版 (a simplified version of your actual interface)

アイコンをタップするとこのスクリーンが表示されてユーザーにアプリが立ち上げ中であることを知らせることができる。
アプリの準備が完了したとき、自動的にこのスクリーンを隠して実際のUIを表示するようになる。

ここに書いてあることは抽象的ですが、おそらくアプリが準備中であることをシステムに通知できる仕組みがあるということを示唆していますね。`AppDelegate`などにそのようなカスタムメソッドがあるのかもしれません。
また、簡易版のUIを表示する目的で使用されることがあるようですが、具体例がなかなか思いつかないですね。

### Required App Metadeta

システムはApp Bundleの中にある`Info.plist`からアプリの設定やどのような情報を扱えるか (capability) を引き出してきます。

ハードウェアの適用やシステムのフレームワークを使うかどうかを記述できます。
ここで記述された要件を満たしていないハードウェアからは、AppStoreからインストールすることすらできなくなるようです。独自デバイスを提供するAppleならではの良い仕様ですね。

※`.plist`は"property list"の略称らしいです。

[`Info.plist`のリファレンスへ](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009247)

## Code Structure of a UIKit app

UIKitは以下を担います。

- システムとのインタラクション
- メインイベントループの実行
- スクリーンへの表示

また、UIKitが提供するオブジェクトは、改良することも視野にいれて提供されているようです。
当たり前ですが、提供者のスタンスは知っておくべきですね。

UIKitのアプリはMVCに基づいて設計されています。

[UIKitアプリの構造の図](https://developer.apple.com/documentation/uikit/about_app_development_with_uikit#3004320)
この図と説明を見る通り、
それぞれのオブジェクトはしっかりと区分けされているようですね。今後の実装ではそれぞれのオブジェクトがMVCを前提に提供されていることは意識したほうが良さそうですね。たとえコード全体のアーキテクチャパターンがMVCではなくてでもです。
また、この図で黄、赤、青で色分けされている分類の通り、カスタムするためのものか、システムのものなのか、はたまた両方できるのか、意識することも重要そうですね。
`UIWindow`の存在は知っていましたが、この図だとカスタムすることはできないようです。カスタムできるものなのかもと思っていたので今後は割り切ったほうが良さそうです。`UIApplication`もアプリの状態を取得するときに使っていた経験の通り、システムとやりとりをするときに使うためだけのもののようですね。

`UIDocument`はディスクに保存するためのデータを管理するためのオブジェクトだそうです。図にあるようにUIKit上にのっているので、スムーズな実装のために使うことがありそうです。

Foundation Frameworkはオブジェクトの表現を定義したり、[Swift Standard Library](https://developer.apple.com/documentation/swift/swift_standard_library)ではFoundationと同じ型が利用できるような仕組みを提供しています。

UIKitにあるもので特筆すべきものとして、`UIView`と`UIApplication`があります。
`UIView`は（UIとして）レスポンシブルなコンテンツを表示するのはもちろん、`UIView`をレンダリングをするときに[Metal](https://developer.apple.com/jp/metal/)のようなフレームワークを使用する事が可能なようです。ゲームエンジンもこの仕組みを使用しているかもしれないですね。

`UIApplicaiton`はメインのイベントループを実行したり、アプリ全体のライフサイクルを管理してくれます。


次回は[Protecting the User’s Privacy
](https://developer.apple.com/documentation/uikit/protecting_the_user_s_privacy)を読みます。お楽しみに。