前回に続いて、Swiftの学習日記です。
教科書は「iPhoneアプリ開発講座 はじめてのSwift」という本です。
今日は第6章の「iOSアプリ開発入門」の「02 iOSアプリの動作の仕組み」を学びました。
Xcodeでアプリのひな形を作ると、自動的にいろんなファイルが出来ますが、ゴチャゴチャしていて、よく分かりませんね?
しかし、基本構造を理解しておくと、全体がスッキリと見渡せるようになって、迷子にならなくなります。
この章の解説は、とても参考になりました。
●第6章 iOSアプリ開発入門 02 iOSアプリの動作の仕組み
目次
02 iOSアプリの動作の仕組み
UIApplicationとUIApplicationDelegate
●学習メモ
(p.208)
これからiOSアプリのプログラムを書くにあたって、まずはiOSアプリがiOS上でどのような仕組みで動作しているのか理解しましょう。iOSアプリの動作の仕組みが理解できると、Xcodeプロジェクトに含まれるファイルがそれぞれどのような役割を担っているかわかるようになります。
「AppDelegate.swift」とか、謎のファイルがありますね!?
UIApplicationとUIApplicationDelegate
iOSアプリの動作に不可欠なもののうち、特に重要なのがUIApplicationというクラスとUIApplicationDelegateというプロトコルです。
まず、iOSアプリの心臓部にあたるのがUIApplicationクラスのインスタンスです(以降、UIApplicationインスタンスと省略)。
UIApplicationインスタンスはiOSとアプリの仲介役を担っており、アプリに起こるさまざまな状態を管理しています。
たとえば「アプリが起動した」や「アプリがバックグラウンドにいった」、「プッシュ通知を受け取った」などといったような「ある状態」になったことを検知し、その時々で必要な処理を実行します。
■UIApplicationインス夕ンス
↑↓
UIApplicationインス夕ンス
(iOSとアプリを仲介しアプリのさまざまな状態を管理)
↑↓
iOSアプリ
iOSアプリで最も重要な働きをしているのが「UIApplicationクラス」のインスタンスです。
こいつがいないと、アプリは動きません。
UIApplicationクラスはiOS SDKであらかじめ用意されているクラスなので、自分で定義する必要はありません。
またUIApplicationインスタンスを生成する処理も、iOSが自動で行ってくれます。
そのため、UIApplicationインスタンスを使えるようにするまでに、何か特別な作業を行う必要はありません。
Xcodeでアプリのひな形を作ると、自動的に用意される部品です。
UIApplicationインスタンスが管理しているさまざまな状態は、ある状態になったタイミングにUIApplicationDelegateプロトコルに準拠したクラスのインスタンス(以降、UIApplicationDelegateインスタンスと省略)が受け取ることができるようになっています。
アプリがある状態になったときに、UIApplicationインスタンスがその状態を検知し、UIApplicationDelegateインスタンスの「その状態になったときに呼び出すメソッド」を呼び出します。
UIApplicationDelegateプロトコルに準拠したクラスは自分で用意します。
そのため、このクラスのメソッドの処理は自由に記述することができます。
これらの仕組みによって、アプリの状態に合わせた挙動を自由にプログラミングすることが可能になっています。
■アプリの状態の通知
状態の変更(アプリ起動など)
↓
UIApplicationインスタンス
↓
UIApplicationDelegate(プロトコル)のメソッドの呼び出し
↓
UIApplicationDelegateに準拠したクラスのインスタンス
↓
メソッド(呼び出されるメソッドの中身は自由に記述可能)
開発者がiOSアプリを作るということは、UIApplicationDelegateプロトコルに準拠したクラスの部分を作っている、ということなんですね!
→全体はこのような仕組みになっていて、自分は今どの部分を作っているのか?ということが分かれば、迷うことがなくなるでしょう。
(参考)
検索してみたら、UIApplicationクラスとUIApplicationDelegateプロトコルの連携について、参考になる解説がいろいろありました。
→ iOS UIApplication UIApplicationDelegate - Google 検索
iOSアプリケーション プログラミングガイド - Apple
https://developer.apple.com/jp/documentation/iPhoneAppProgrammingGuide.pdf
この文書は、Appleの公式ガイドなので、熟読しておく必要があります。
(p.24) 図 2-1 iOSアプリケーションの主要オブジェクト
「アプリケーションデリゲート」オブジェクト
アプリケーションデリゲートは、アプリケーション側で実装するカスタムコードの心臓部に当たります。
UIApplicationオブジェクトと連携して、アプリケーションの初期化、状態遷移、上位レベルのさまざまなイベントを処理します。
アプリケーションに存在することが保証された唯一のオブジェクトでもあるので、データ構造体を初期化する場としてもよく使われます。
上記の図について、解説記事がありました。
AppDelegateはアプリケーション側で実装するカスタムコードの心臓部です。 起動時やバックグラウンドで何かを実施したいとき(例えばプッシュ通知とか)に、このクラスの中のメソッドを用いて実行します。
iOSアプリの動作の仕組みを、「イベントの処理の流れ」に着目して、詳細に説明した記事がありました。
イベント駆動とはイベントと呼ばれるアプリや端末上で起きた出来事に対して処理を行うプログラムの実行形式のことです。
イベントループとはイベントを検知するためのループ処理(for または while を使った無限ループ)のことです。実行ループや RunLoop と呼ばれることがあります。
iOS ではアプリを起動してから終了するまで UIApplication オブジェクトがイベントやアプリの状態を管理しています。iOS はイベントが発生するとイベントキューと呼ばれるキューにイベントを溜めていきます。そこに溜まったイベントをイベントループが順番に取り出し UIApplication オブジェクトがイベントメソッドの通知を行います。
ライフサイクルイベントは端末やアプリで起こった出来事に対するイベントです。
イベントループでライフサイクルイベントが検知されると UIApplication オブジェクトが決められた順番で UIApplicationDelegate オブジェクトや UIViewController オブジェクトのメソッドを呼び出します。
アプリ全体に関係するイベントメソッドは UIApplicationDelegate プロトコルに、画面に関係するイベントメソッドは UIViewController クラスに定義されています。
UIApplicationやUIApplicationDelegateなどを中心に、iOS SDKで提供されている他の機能についても、詳細に説明した記事がありました。
iOS から提供されているクラスの説明
それでは上記の図の中で iOS から提供されているクラスについて詳しく見ていきましょう。
iOSアプリの仕組みを理解しておくことで、開発者は何を作れば良いのか?という理解が深まりました。
●まとめ
・iOSアプリの動作は、イベントの処理の流れに着目して、追いかけてみる。
・UIApplicationクラスが、全体の仕切り役。(dispatcher役?)
・UIApplicationDelegateプロトコルに準拠したクラスが、下請け役。実際の作業を引き受けている。ここの機能を開発者が作る。
・Swiftの文法で、「プロトコル」の使い方、プロトコルを利用したデリゲートパターンの使い方に慣れておく。
本やネットで分かりやすい情報が提供されていて、とても助かりました。
→有益な情報提供、どうもありがとうございます。