アプリケーションのビルド、実行、デバッグ
学習の目的
この単元を完了すると、次のことができるようになります。
- シミュレーターを使用する。
- 物理デバイス上でアプリケーションを実行するように Xcode を設定する。
- ブレークポイントを使用する。
- コードのトラブルシューティングと診断を行う。
- エラー、警告、バグを区別する。
誰でも間違えることはあります。デバッグは、コード内の間違いを特定して修正するプロセスです。この単元では、iOS アプリケーションのデバッグに必要なツールと手法について学習します。
シミュレーターでのアプリケーションのテスト
Swift で基本的な構文の記述を始めたので、コードが実際のアプリケーションとしてどのように表示されるか知りたいところですね。Xcode のシミュレーターを使用すると、アプリケーションをビルドして、デバイス上でアプリケーションがどのように表示されるかをテストできます。
アプリケーションの初期テストはシミュレーターで行うことをお勧めします。シミュレーターでは、古いモデルも含めたすべてのサポート対象デバイスを正確に表現できるためです。これらのデバイスオプションは、手元にはないデバイスでアプリケーションがどのように動作するかを確認するのに役立ちます。
ただし、可能であれば、物理デバイスでもアプリケーションのテストを行います。一部の操作の実行は、物理デバイスに依存しています。
たとえば、シミュレーターを使用してカメラアプリケーションとの連携をテストしようとすると、プログラムはクラッシュします。コードが Mac 上に存在しないハードウェアコンポーネント (加速度センサー、ジャイロスコープ、近接センサーなど) に連動する場合は、物理デバイスでアプリケーションをテストする必要があります。
シミュレーターでは、次の一般的な機能をテストできます。
- 電話がかかってきたときにユーザーインターフェース (UI) がどのように動作するかを確認する。シミュレーターで電話を受けることはできませんが、通話状況によってアプリケーションの表示がどうなるかを確かめることはできます。
- アプリケーション内でシェイク操作がどのように機能するかをテストする。
- キーボードが表示されなくなったときに、アプリケーションがどうなるかを確認する。これは、よくある UI の問題です。[Connect Hardware Keyboard (ハードウェアキーボードを接続)] オプションを使用すると、Mac キーボードはシミュレーションデバイスの外部キーボードとして機能します。外部キーボードを使用して、シミュレーションキーボードが表示されなくなったときにアプリケーションがどのように動作するかをテストします。
- アプリケーション内で Force Touch がどのように機能するかを確認する。
- スローアニメーションオプションを有効にする。このオプションは、アニメーションを使用して問題のデバッグに役立ちます。
- GPS 機能をテストする。シミュレーターには本物の GPS は含まれていませんが、疑似位置を指定するか、組み込み済みの位置を使用することができます。
シミュレーターには、考慮すべきソフトウェア上の制限事項があります。たとえば、プッシュ通知は物理デバイスでのみ使用できます。また、メールやテキストメッセージの作成に使用する MessageUI
フレームワークには、シミュレーターとの互換性がありません。
シミュレーターで問題が発生した場合は、物理デバイスでコードをテストして、同じ問題が発生するかを確認します。
アプリケーションのビルドと実行
[Run (実行)] ボタンによって、Xcode の複雑な作成プロセスを意識する必要がなくなります。[Run (実行)] ボタンをクリックすると、Xcode は有効なスキームを取得してソースを実行可能なファイルにコンパイルします。
そして、選択されている有効なスキームに応じて、実行可能ファイルをシミュレーターまたは物理デバイスにリリースします。さらに、実行可能ファイルを起動し、デバッガーを添付します。
デバッグについては、このレッスンの後半で学習します。まず、シミュレーターで何ができるかを確認しましょう。
1.Xcode で新規プロジェクトを作成し、iOS の [Single View Application (単一ビューアプリケーション)] テンプレートを選択します。
2.Xcode ツールバーの [Scheme (スキーム)] メニューで、リストからシミュレーションするデバイスを選択します。
3.[Run (実行)] ボタン をクリックして、シミュレーターでアプリケーションを起動します。
初めてアプリケーションを実行するときには、Mac で開発者モードを有効にするかを尋ねられます。開発者モードでは、Xcode が特定のデバッグ機能にアクセスできます。このモジュールのすべての単元では、開発者モードが有効になっていることを前提としています。
シミュレーターが起動すると、背景が白のデバイスの画像が表示されます。コードをカスタマイズしていないため、アプリケーションは空白です。
4.シミュレーターメニューバーで、[Devices (デバイス)] > [Home (ホーム)] を選択し、シミュレーションデバイスの他のアプリケーションをクリックしてみます。シミュレーターで次のいくつかの機能を使用してみてください。
- デバイスボタンをクリックして、Siri とやりとりを行い、Simulator が物理デバイスのように反応することを確認する。
- [Features (機能)] メニューで、アプリケーション内にいるときに通話中ステータスバーを切り替えて、アプリケーションがどのように反応するかを確認する。
- Safari を開いて画像を検索する。Safari の下部にある [share (共有)] ボタンを使用して画像を保存します。画像は、シミュレーションデバイスの写真アプリケーションに表示されます。
- [Devices (デバイス)] メニューで画像の向きを回転させて、横モードに切り替えたときのアプリケーションの応答性をテストする。
- ウィンドウの隅をドラッグして、デバイス画像のサイズを変更する。物理デバイス、ポイント精度、ピクセル精度を正確に表現するには、[Windows (ウィンドウ)] メニューの表示オプションを使用します。
シミュレーターでアプリケーションを実行することは、テストの最初のステップとして重要です。新しい機能を追加したときには、通常、コードをテストする最初の場所がシミュレーターです。
個人デバイスでのテスト
全般的に、アプリケーションの開発とデバッグを行うときにシミュレーターは適切に機能しますが、常に実際のハードウェアでコードをテストすることをお勧めします。物理デバイス上でコードをテストするには、Apple Developer Web サイトからアカウントを取得する必要があります。
開発者アカウントにサインアップした後に、アカウントを Xcode に追加します。
1.Xcode の設定で [Accounts (アカウント)] タブに移動します。
2.開発者アカウントの Apple ID を追加します。
ログイン情報を入力すると、物理 iOS デバイス上でアプリケーションの実行とデバッグを行えるようになります。
3.適切なケーブルを使用して、iOS デバイスを Mac に接続します。
Xcode は必要な情報をデバイスから自動的にダウンロードして、[Scheme (スキーム)] メニューにデバイス名を表示します。
4.物理デバイスの名前を選択します。通常これは、リスト上部のデバイスシミュレーターの前にあります。
5.もう一度アプリケーションをビルドして実行します。
開発者証明書を信頼するように求めるメッセージが表示されることがあります。メッセージの手順に従って、デバイスがアプリケーションを実行することを許可します。
6.もう一度アプリケーションをビルドして実行します。
シミュレーターに表示されたのと同じシンプルな白い画面が iOS デバイスに表示されます。
7.アプリケーションの実行を停止するには Xcode ツールバーの左端付近にある [Stop (停止)] ボタン をクリックします。
ワイヤレスペアリングの有効化
アプリケーションをテストするたびにデバイスを Mac に物理的に接続しなくても済むように、アプリケーションをネットワーク上にリリースします。
1.適切なケーブルを使用して、iOS デバイスを Mac に接続します。
2.Xcode メニューバーで [Window (ウィンドウ)] > [Devices and Simulators (デバイスとシミュレーター)] を選択します。
[Devices and Simulators (デバイスとシミュレーター)] ウィンドウが表示されます。
3.[Devices and Simulators (デバイスとシミュレーター)] ウィンドウの [Connected (接続済み)] ペインでデバイスが選択されていることを確認します。
4.[Connect via network (ネットワーク経由で接続)] チェックボックスを選択します。
デバイスが Mac と同じネットワーク上にある場合、数秒以内にデバイスの名前の横に地球アイコンが表示されます。このアイコンは、デバイスがワイヤレスで接続されていることを示します。
5.デバイスを Mac から切断し、ワイヤレスでアプリケーションのビルドと実行を継続します。
これらのステップがうまくいかない場合は、会社や施設のネットワーク上にいて、システム管理者がネットワーク制限を有効にしている可能性があります。
その場合は、手動でデバイスを Xcode にペアリングします
1.Xcode メニューバーで [Window (ウィンドウ)] > [Devices and Simulators (デバイスとシミュレーター)] を選択します。
2.Control キーを押しながらデバイスをクリックします。
3.表示されるドロップダウンメニューで [Connect via IP Address (IP アドレス経由で接続)] をクリックします。
4.プロンプトにデバイスの IP アドレスを入力し、[Connect (接続)] をクリックします。
- デバイスの IP アドレスを調べるには、[Settings (設定)] > [Wi-Fi] に移動します。
- 接続されているネットワークを見つけます。ネットワークに接続されていない場合は、信頼するネットワークに接続します。
- 中に「i」と書かれた青い円をタップします。
これで、ワイヤレスでアプリケーションのビルドと実行を継続できるようになりました。
アプリケーションのデバッグ
アプリケーションに新しい機能を追加するときには、一旦止まって、これらの変更をテストする必要があります。小さな変更をテストする方が、大きな変更をテストするより簡単です。テストを行うときには、一部の機能が計画どおりに動作しないことを想定しておきましょう。これら問題は、明らかな場合もあります。たとえば、コンパイラーでコードに関するエラーや警告が発生する場合などです。バグは、それよりもわかりにくく、発見と解決に手間がかかります。
Xcode からアプリケーションを起動すると、アプリケーションは自動的に Xcode デバッガーに接続されます。デバッガーを使用すると、コードの実行をリアルタイムで観察できます。デバッガーのステッピング機能を使用すると、アプリケーションを少しずつ実行し、ステップごとに一時停止して、状態がどのように変化したかを調べることができます。この機能は、バグを特定しようとしているときには特に便利です。
一般的に発生する問題には、警告、エラー、バグの 3 種類があります。
警告
警告は、最も簡単に修正できる問題です。コードに関する重要ではない問題を示しています。警告を解決することが望ましいですが、警告が発生してもアプリケーションの通常の実行は妨げられません。コンパイラーがコードをビルドするときに警告が生成されます。
警告が発生するのは、次のような状態の場合です。
- 実行できないコード
- 変化しない変数
- 廃止されたコードまたは古いコード
Xcode での警告のしくみを確認するには、次の手順を実行します。
1.ViewController.swift ファイルを開きます。
2.viewDidLoad()
メソッドを次のように変更します。
override func viewDidLoad() { super.viewDidLoad() let x = 4 }
この新しい行は、x
という定数に値 4
を割り当てます。
3.Command-B キーを使用してアプリケーションをビルドします。
黄色い (三角形の) 警告アイコンとメッセージが新しいコード行の横に表示されます。
この例での警告は、新しい値が一度も使用されていないことを示し、問題を修正するためのいくつかの方法を提示しています。
4.警告メッセージの左にある黄色い三角形をクリックして、ボックスを展開します。
警告メッセージは、1 行のテキストに収まらない場合があります。通常、修正方法の提案は、展開されたボックスの下部に表示されます。
警告が発生してもアプリケーションの通常の実行は妨げられないことを覚えておいてください。ここでは、この問題は無視します。
エラー
名前の入力ミスや間違った構文の使用などによって、コンパイルできないコードを記述してしまうことがあります。この種類の問題があると、コンパイラーでエラーが生成されます。アプリケーションをビルドして実行するには、エラーを解決する必要があります。
この概念を理解するために、ViewController.swift ファイルにエラーを入れてみましょう。
1.viewDidLoad()
メソッドの最下部に新しい行を追加します。
navigationController.title = "Greetings"
2.Command-B
キーを使用してアプリケーションをビルドします。
新しいコード行の横に赤いエラーメッセージが表示されます。
3.エラーメッセージの左にある赤い円をクリックして、ボックスを展開します。
コンパイルエラーメッセージが表示され、下部には提案される修正方法が表示されます。この問題を修正しないと、アプリケーションをコンパイルできません。
4.提案された修正方法のいずれかの横にある [Fix (修正)] ボタンをクリックして問題を解決します。
明らかな修正方法がないエラーもあります。提案される修正方法が常に表示されるとは限りません。エラーメッセージに表示された情報を注意深く読み、何が問題であるかのヒントを得ます。エラーの原因は入力ミスや誤った構文であることが多いことを覚えておいてください。まずは、そのような簡単な間違いを探します。
続行する前に、新しい行を viewDidLoad()
メソッドから削除します。メソッドは次のようになります。
override func viewDidLoad() { super.viewDidLoad() }
バグ
コード内の単純な問題はコンパイラーによって巧みに検出され、警告やエラーが生成されますが、バグはさらに複雑な問題で、実行時にクラッシュや意図しない動作などの問題を引き起こします。多くの場合、これらの問題の原因はロジックの誤りです。警告やエラーはアプリケーションを出荷する前に修正されますが、バグはユーザーがアプリケーションを使用するうちに発見されることがよくあります。
Apple は、特定の種類のバグを防ぐいくつかの機能を Swift に設計しました。たとえば、Swift アプリケーションで optional を使用することで、null ポインター例外を避けることができます。null ポインター例外は、制限されたメモリに誤ってアクセスしようとすることによって起こるクラッシュです。Swift では、適切なコードが記述しやすくなっていますが、それでもバグは発生します。バグを特定し解決することは、練習と経験によって培われる重要なスキルです。
ViewController.swift
で、super.viewDidLoad()
の下に次のコード行を追加します。
var names = ["Tammy", "Cole"] names.removeFirst() names.removeFirst() names.removeFirst()
今はまだ Swift に精通していないかもしれませんが、これらの行は簡単に理解できます。names
は、Tammy と Cole の 2 つのテキストを含むリストです。後続の各行は、リストから最初の項目を削除します。removeFirst()
メソッドは 3 回コールされていますが、リストには項目が 2 つしかありません。アプリケーションを実行するとどうなるか確認しましょう。
1.アプリケーションをビルドします。
構文は有効なので、「Build Succeeded (ビルドが成功しました)」メッセージが表示されます。
2.アプリケーションを実行します。
数秒後、プログラムはクラッシュし、コンソールに次のメッセージが表示されます。
Fatal error: Can't remove first element from an empty collection
プログラムは、空のリストから要素を削除しようとしたときにクラッシュします。このバグは明らかなように見えますが、バグの中には非常にわかりにくいものもあります。バグの原因がすぐにわからない場合は、クラッシュが発生した箇所の周辺のコードからデバッグを開始します。
ブレークポイントの使用
ブレークポイントを使用すると、デバッガーで実行中のアプリケーションを特定の箇所で一時停止できます。アプリケーションの一時停止中に変数の状態を調べて、アプリケーションの予期しない動作の理由について理解を深めることができます。
リストの問題を診断するためにブレークポイントを追加する手順は、次のとおりです。
1.アプリケーションを一時停止する行の左の余白をクリックして、新しいブレークポイントを作成します。この場合、var names = ["Tammy", "Cole"]
の行にブレークポイントを追加します。
2.アプリケーションをビルドして実行します。
プログラムがブレークポイントの箇所で実行を一時停止します。強調表示されている行はまだ実行されていません。
デバッグ領域の左側で [Variables View (変数ビュー)] を見てみましょう。変数 names の値は 0 個になっています。なぜだかわかりますか?
強調表示されている行はまだ実行されていません。そのため、names リストには値がないのです。
ステッピング
デバッガーのステッピングという機能を使用すると、アプリケーションの実行を詳細に制御できます。ステッピングは、最新のデバッガーにはよくある機能です。Xcode では、ステッピングコントロールはエディター領域の下部の [Variables View (変数ビュー)] のすぐ上にあります。
ステッピングコントロールを 1 つずつ見てみましょう。
- Continue (続行) : 次のブレークポイントに達するかアプリケーションが終了するまでコード実行を再開します。
- Step over (ステップオーバー) : 現在選択されているコード行を実行し、実行を一時停止します。
- Step into (ステップイン) : 現在選択されている行が関数コールであれば、その関数の最初の行まで実行を進め、実行を一時停止します。そうでない場合は、このコントロールはステップオーバーと同じように動作します。
- Step out (ステップアウト) : 関数の残りの行をすべて実行し、関数コールの次の行で実行を一時停止します。
ステッピングコントロールを使用してコードの最後の行まで進む手順は、次のとおりです。
1.[step over (ステップオーバー)] ボタンをクリックします。
names
リストが 2 つの値を持つようになりました。
2.names
の左にある [disclosure (表示)] 三角形をクリックすると、値が表示されます。
3.もう一度 [step over (ステップオーバー)] ボタンをクリックし、リストから最初の要素を削除します。
names
リストに残っている値は 1 つになりました。
4.もう一度 [step over (ステップオーバー)] ボタンをクリックし、リストから 2 番目の要素を削除します。
names
リストの値は 0 個になりました。
すべての値が names
リストから削除されました。ただし、現在選択されているコード行は要素をもう 1 つ削除しようとします。このコードが実行されると、アプリケーションはクラッシュします。簡単なデバッグ手法を使用して、最後の removeFirst()
メソッドコールの前にリストが空になっていることを確認しました。
コードの最後の行を削除して、問題を修正します。
間違えること
いかに経験豊富なプログラマーでもバグが入ってしまうことはあります。プログラマーの皆さんは、今後も上のようなバグに出会うことでしょう。自分のコードにバグを発見しても落ち込むことはありません。デバッグは、練習と経験によって向上するスキルです。iOS アプリケーション作成の経験を積んでいくうちに、さまざまな種類のバグを認識して避けることができるようになります。
ラボ: 最初のアプリケーションのデバッグ
概要
このラボの目標は、コンパイラーエラー、ランタイムエラー、コンパイラー警告を見つけて解決することです。
パート 1: コンパイラーエラーの発見と修正。
1.Xcode プロジェクト FirstTimeDebugging をダウンロードして開きます。
2.アプリケーションを実行しようとします。
いくつかのコンパイラーエラーのためにアプリケーションを実行できません。この単元で学習したとおり、間違いがある行 (またはコンパイラーが間違いだと推測した行) にある赤い記号 (八角形) はコンパイラーエラーを示しています。[Issue (問題)] ナビゲーターにもすべてのコンパイラーエラーが表示されます。
3.コンパイラーエラーを修正して、アプリケーションを実行できるようにします。
このアプリケーションのコンパイラーエラーの原因となり得る一般的な間違いには次のものがあります。
- 括弧または中括弧の不足や余分 (左または右)
- 関数やプロパティの参照でのスペルミス。コンパイラーは文字どおりに解釈するため、指定した正確な名前で関数やプロパティを参照することが求められます。
1 つの間違いによって複数のコンパイラーエラーが発生することがあります。1 つの間違いを修正することで残りのエラーがすべてなくなる場合があります。
パート 2: ランタイムエラーの発見と修正。
プロジェクトから赤いエラー記号をすべて消すことができましたか? そうであれば、ランタイムエラーを見つけて修正しましょう。
1.アプリケーションを実行します。
アプリケーションはシミュレーターで開いた直後に実行を停止し、画面上のコードの 1 行に赤い線が表示されます。これは、実行中にエラーが発生したことを示しています。
2.コンソール領域のテキストを見て、問題を特定する手がかりを探します。
このランタイムエラーを解決してみましょう。影響を受けたコードの箇所やその前にブレークポイントを追加して、もう一度アプリケーションを実行することを検討します。
パート 3: コンパイラー警告の発見と修正。
これでアプリケーションが実行できるようになったので、最後のいくつかの問題に注目します。
1.[Issue (問題)] ナビゲーターを開きます。
3 つの黄色い三角形が警告を示しています。
2.これらのすべての警告に対応します。
お疲れさまでした! プロジェクトからコンパイルエラー、ランタイムバグ、警告がなくなりました。
必要であればソリューションのチェック
こちらがエラー修正後のプロジェクトです。これを上記のリンク先のプロジェクトと比較し、どのような変更が行われたのかを確認してください。