メインコンテンツへスキップ
しくみとUIKit-note

iOSアプリを作ろう・アプリの仕組みとUIKit

    iOSアプリの起動時の仕組みと実行中の仕組みの概要です。基本的な仕組みと UIKit の主なクラスの関係を解説します。

    毎月札幌でiOSアプリ作りをアシストするセミナーをやっています。1時間にわたるセミナーの全内容を物理的に参加できない方のためにnote上で公開します。ぜひアプリ作りにチャレンジしてください。

    iOSアプリを作ろうシリーズのセミナーは今後も月一回のペースで続けます。
    詳細は connpass.com の 札幌Swift でご確認ください。そして機会があればぜひ参加してください。
    アプリ作りやプログラミング教育に関連する話題は 札幌Swift のfacebookページ で発信しています。

    快技庵(かいぎあん)の高橋です。
    1980年代後半からのMacのアプリを作ってきた現役開発者で現在は電子書籍などのiOSアプリを作っています。
    note や Twitter のアイコンは、最初に作った電子書籍アプリ豊平文庫のアイコンにしています。

    『iOSアプリを作ろう』シリーズ、今回は『アプリの仕組みとUIKit』です。
    アプリのしくみを知り Xcode で作るコードがどのように動作しているかを確認してください。

    画像

    今回はスライド枚数も多く内容も盛りだくさんです。

    まずはiOSアプリをホーム画面から起動した時の実行中の構造からはじめます。

    iOSアプリの実行中の構造

    画像

    Apple の公式資料 About App Development with UIKit の説明図(図4)です。

    画像

    この図ではアプリの構造も MVC(モデル・ビュー・コントローラー)だとしています。
    いきなり、この図だけを見てもピンと来ないと思いますが心配はいりません。

    下に色分けの短い説明(Custom Objects/System Objectsなど)があります。
    システムだけを灰色にしました。残りがプログラマが Xcode で作成する部分です。

    画像

    システムのオブジェクトとして UIApplication をまず注目しましょう。 UIApplication はクラス名です。

    UIApplication クラス

    画像

    UIApplication クラスは UIKit フレームワークで定義されています。
    通常のプログラミングで使うことはめったにありませんが、仕組みでは重要なので取り上げました。

    画像

    UIResponder クラスを継承しています。これまで取り上げていないクラスですがアプリの操作を扱う重要なクラスで、UIResponder については後で説明します。
    UIApplication クラスはタイププロパティ shared を持っていて、コードのどこからでもアクセスできます。
    これは UIApplication クラスのインスタンスが実行中に一つしかないためです。(ひとつは必ずあります)

    UIApplication.shared

    のコードで UIApplication クラスのインスタンスを参照できます。
    たくさんのプロパティやメソッドを持つクラスですが、最も重要なのは delegate プロパティです。
    UIApplication クラスはデリゲートで指定するオブジェクトでカスタマイズします。

    アプリケーションデリゲート

    画像

    UIApplication をカスタマイズする「アプリケーションデリゲート」は UIApplicationDelegate プロトコルを採用しているクラスのインスタンスです。このプロトコルの各メソッドにカスタマイズのコードを書きます。
    「アプリケーションデリゲート」のソースは各アプリが持っていて、それぞれのアプリで必要な処理を実装できます。

    UIApplication.shared.delegate

    のコードで自分のアプリケーションデリゲートのインスタンスにアクセスできます。
    このしくみはアウトレットなどで接続する必要なくアクセスできる事が特徴です。アプリ内のどのコードからでもアクセスできます。

    (画面関係はあとで説明しますが)UIApplication.shared.delegate.window でアプリのウインドウにもアクセスできます。

    画像

    最初の図に戻りますが、アプリの基本的で重要な共通処理は UIApplication のインスタンスが実行します。このインスタンスは必ず一つだけで UIApplication.shared でどのコードからでも参照できます。
    アプリ独自の初期化などカスタマイズはアプリケーションデリゲートのソースに書くことができます。

    アプリ起動時のうごき

    画像

    ここからはホームでアプリアイコンをタップして起動した時にどうなるかの話です。
    Apple のドキュメント「About the App Launch Sequence」の図1では
    main()
    がスタートです。メイン関数は昔のプログラミングの教科書に必ず出てくる「Hello World!」を表示するコードを書く部分です。

    Objective-C の main()

    画像

    Swift言語が登場する前から使われている「Objective-C言語」の main()関数はこのようになっています。
    「@autoreleasepool」はメモリ処理に関係する古いキーワードです。
    UIApplicationMain() 関数を呼んでいます。

    UIApplicationMain

    画像

    UIApplicationMain()関数は名称からわかるように UIKit フレームワークの関数です。UIApplication クラスのインスタンスとアプリケーションデリゲートのインスタンスを作り実行を開始する、アプリには重要な関数です。
    重要な関数ですが、アプリでは必ず最初に一度だけ呼び出す、使い方が完全に決まっている関数でもあります。

    UIApplicationMain()関数には4つの引数があり、最初の二つはmain()関数の引数をそのまま渡します。最後の引数はアプリケーションデリゲートのクラス名を渡します。

    画像

    UIApplicationMain() 関数は処理を開始するアプリのアプリケーションデリゲートクラス名さえわかれば呼び出せるので、Swift言語の場合は @UIApplicationMain キーワードでデリゲートのアプリケーションクラスを指定し、UIApplicationMain()関数の呼び出しを省略できるようになっています。

    @UIApplicationMain キーワード

    画像

    Xcode で iOSのテンプレートを選ぶとアプリケーションデリゲートクラスのコードに @UIApplicationMain キーワードがついています。またプロジェクトにメイン関数を書いた main.swift はありません。
    コード上の記述は省略できますが、内部では main から始まりUIApplicationMain()関数も呼び出されています。

    画面のロード

    画像

    アプリ起動時の動き、この図では UIApplicationMain() の次は Load the main UI file とあります。
    main UI file とは Xcode のテンプレートではストーリーボードファイルです。

    画像

    最初の画面を含むストーリーボードファイルは Info.plist ファイルで指定されています。
    「Info.plist」ファイルは各アプリにひとつだけこの名称で存在しているアプリの情報が入っているファイルです。

    ストーリーボードファイルには画面UIの配置(階層・位置サイズ・オートレイアウトの設定情報)や別の画面の呼び出しなどの情報が入っています。
    iOS では MVC のしくみでアプリが構成されています。
    ストーリーボードファイルでは主にV(ビュー)とC(コントローラー)の初期情報が入っています。

    画像

    ストーリーボードファイルの指定はプロジェクトファイルの General タブの Deployment Info > Main Interface で指定します。
    テンプレートでは Main が設定済みです。
    プロジェクトファイルの Info タブで「Info.plist」ファイルの内容も確認できます。
    「Info.plist」ファイルはキーに対応する内容のペアでアプリの起動やインストールに関係する情報が入っています。

    Initial View Controller

    画像

    ストーリーボードファイルには最初に表示する画面として、イニシャルビューコントローラーが指定されています。
    イニシャルビューコントローラーにはドキュメントアウトライン(ストーリーボード内の全オブジェクトのアウトライン表示)では Storyboard Entry Point と表示されます。
    インターフェースビルダー画面(グラフィカル表示)では矢印が指しています。

    アトリビュートインスペクターの View Controller 部分に Is Initial View Controller のチェックボックスがありチェックされています。
    他のビューコントローラーの Is Initial View Controller のチェックボックスをチェックしてイニシャルビューコントローラーを切り替えることもできます。
    (それまでのイニシャルビューコントローラーのチェックは自動で外れます)

     
     
    古くからのMacプログラマ、現在はiOS向けに青空文庫リーダーアプリなどを作っている。 Swift関連記事と、開発したアプリ紹介記事を書いています。 有料記事はお得に読めるマガジンもどうぞ。𝕏は@houhei

    あなたへのおすすめ