macOSアプリのプランニング
Mac向けソフトウェアを初めて開発する場合は、利用するツールやテクノロジーについてよく理解しておきましょう。Appleでは、開発を始めるために必要なすべてを提供しているため、macOSテクノロジーで、アプリで目的とする機能やパフォーマンスを実現することができます。
広がる可能性
スピードとパワーという魅力を持つMacでは、macOSによりアプリは最高のパフォーマンスを発揮できます。Macは、タスクを可能な限り高速に実行するための強力な処理能力を必要とするアプリにとって、理想的なプラットフォームです。Macはさらに、コミュニケーション、ニュースや情報の取得、ソーシャルメディアの利用、ゲームのプレイなどの日常的なタスクにも使用されます。
macOSには、コンテンツを提供するためのアプローチが複数あり、選択したアプローチが初期段階の決定事項に影響を与えます。
標準的な要素からUIを構築する
macOSに組み込まれているボタンやテキストラベル、およびその他の標準的なビューやコントロールを利用することによって、アプリを短期間で構築できます。コントロールの外観をカスタマイズしたり、まったく新しいビューを構成して、コンテンツを個性的に演出することも可能です。このアプローチは、ほとんどのアプリで効果的で、開発期間の短縮にもつながります。
UIのないソフトウェアを構築する
このアプローチは、UIを必要としない軽量なツールやユーティリティに適しています。コマンドラインのツールやスクリプト、XPCサービス、カスタムファイルシステムやクラウドストレージに対応するためのモジュール、データベース/サーバソフトウェア、オープンソースのツール、新しいプログラム言語、UNIXツールなどを開発する際に使用します。
特定のアプローチを選択した後は、アプリに必要な機能について検討します。いくつかのコアテクノロジー以外にも、特定の機能を実現する上での必要性に合わせて、ほとんどのテクノロジーを採用できます。macOSのテクノロジーにより、ローレベルの細部なハードウェア機能を設計する必要がなく、機能を構築するための安定的な基盤も提供されます。
既存のiPadOSアプリがある場合は、Mac Catalystを使用してMac対応バージョンを作成することも可能です。
開発を始める場所
ソフトウェアの開発は、Appleの統合開発環境であるXcodeで始めます。Xcodeには、プロジェクト管理、コードエディタ、UI用のビジュアルエディタ、デバッグツール、各種デバイスのシミュレータ、パフォーマンス評価ツールなど、ソフトウェア開発に必要なすべてのツールが用意されています。またXcodeには、「フレームワーク」と呼ばれる、ソフトウェア開発用のシステムコードモジュールが含まれています。
Xcodeには、iOS、iPadOS、macOS、tvOS、watchOS向けの各SDKが用意されています。
Xcodeで新規プロジェクトを作成するには、「File (ファイル)」>「New (新規)」>「Project (プロジェクト)」を選択して、表示される指示に従い、macOS向けアプリの開発を開始します。新規プロジェクトには、開発の出発点を決定付けるアプリのタイプと、開発の開始を支援するための部分的なデフォルトコードが付属します。Xcodeの使用方法に関するその他の詳細は、Xcodeのドキュメントで確認してください。
Swift Playgroundsは、コードや開発テクノロジーを学習および実験したいユーザーを対象とした、インタラクティブなコーディング環境です。詳細は、「Swift Playgrounds」をご参照ください。
Swiftを利用する
プロジェクトを初期構成する際は、使用するプログラム言語を検討します。構文が簡潔な上、安全性を考慮した設計のもとコードの表現力をより豊かにする最新機能を装備していることから、Swiftが推奨されています。またSwiftのコードにより、処理が非常に高速なソフトウェアの作成が可能で、Objective-Cとの相互互換性もあるため、同一プロジェクト内に両言語のソースファイルを追加することもできます。
Swiftプログラミング言語ガイド
Swiftプログラミング言語ブックには、Swiftプログラム言語の概要がすべて網羅されており、Swiftの学習に向けて第一歩を踏み出す上で最適な資料です。
アプリ構築のテクノロジーを選択する
初期段階ではさらに、インターフェイスに使用するアプリ構築のテクノロジーを選択する必要があります。Appleのアプリ構築のテクノロジーでは、macOSがアプリと通信するために必要となるコアインフラストラクチャが提供されます。また、インターフェイスの構築やイベントの処理などに使用するプログラミングモデルも定義されます。
SwiftUI
SwiftUIでは、プラットフォームに依存しないモダンなアプローチで、UIおよびアプリのインフラストラクチャを構築できます。SwiftUIビューの標準セットからプログラムによってインターフェイスを指定、またはカスタムビューを作成して外観を自由に構築した後は、そのインターフェイスをリアルタイムに表示して視覚的にチェックできます。実行時には、作成したコードをシステムが使用してアプリの最終的なインターフェイスが構築され、その後の変更が管理されます。UIに対するこのプログラム的なアプローチでは、多くの標準的な動作を自由に使用でき、UIを最新の状態に維持するためのプロセスもシンプルになります。SwiftUIの詳しい使用方法については、「SwiftUIの紹介」チュートリアルをご参照ください。
AppKit
AppKitでは、Storyboardを使用してインターフェイスを視覚的に構築できます。AppKitには、より従来的なアプリ開発アプローチが用意されており、インターフェイス要素を自由に管理できます。ビューやコントロールを更新するために必要なコードを記述できるほか、各要素の構成を変更したり、変更内容をアプリ内の別の箇所に伝えることができます。AppKitを使用してアプリを開発する場合は、AppKitに関するドキュメントをご参照ください。
SwiftUIは、アプリのインフラストラクチャとUIを構築するためのテクノロジーとして広く使用されており、開発に向けた優れた出発点となっています。UIをAppKitで構築した場合でも、SwiftUIとAppKitには相互互換性があるため、SwiftUIのビューとAppKitのビューを同じビュー階層内に混在させることも簡単にできます。
アプリのインフラストラクチャ構築に加え、macOSには、アプリのデータ構造を構築するためのテクノロジーも用意されています。Swift標準ライブラリおよびFoundationフレームワークには、頻繁に使用する基本的なデータ型(Array型、Dictionary型)や、文字列、数字、日付、およびその他の一般的なデータ値の型が用意されています。またカスタム型を作成し、SwiftのCodableサポートを採用してそれらの型をディスク上で永続化することも可能です。アプリがより大規模な構造化データを管理する場合は、Core DataおよびCloudKitを使用してそのデータの管理および永続化を行うことを検討してください。
ユーザー体験をデザインする
魅力的な体験を提供するアプリには、ユーザーが自然と集まります。全体的に分かりやすいレイアウトで見た目がよく、適切なコンテンツが強調されるUIを構築してください。
Macには、表現豊かなインターフェイスを構築するための十分な画面スペースがあるため、情報を直感的に表現する方法を検討します。また、システム固有のデザインパターンがUIに与える影響についても考慮します。
- ウインドウは、アプリのUIにおける中心的な要素です。ウインドウを1つまたは複数作成し、類似するコンテンツや異なるコンテンツを各ウインドウ内に配置します。ウインドウのサイズは、固定することもユーザーが変更できるようにすることもできます。集中できる作業環境を実現するため、フルスクリーンモードにも対応させましょう。
- メニューは、コンテンツに対して実行可能な操作を定義します。画面上部のメニューバーには、アクティブになっているアプリのメニューが表示されます。開発するアプリにおいて適切な操作を特定し、コンテンツの操作方法を反映したメニューを構成します。
- Dockは、アプリ、ドキュメント、ウインドウ、フォルダへのアクセスを容易にします。カスタムのDockメニューを追加すると、頻繁にアクセスするコマンドを表示したり、アプリのアイコンにバッジを追加して新規コンテンツがあることを通知したりできます。
ヒューマンインターフェイスガイドライン
Appleのヒューマンインターフェイスガイドラインには、アプリのインターフェイスをデザインする方法、Macでコンテンツを操作する方法およびインタラクションを管理する方法に関する重要な情報が記載されています。macOSのエコシステムについて学習する際はこれらのガイドラインを最初に確認することが大切です。該当するAppleのデザインリソースを参考にしながらアプリの開発を行ってください。
一部の機能やテクノロジーは、すべてのmacOSアプリにおいて必要不可欠です。最初のUIを計画する際は、必ず以下の機能に対応してください。
ウインドウコントローラ
macOSでは、インターフェイス内の1つのウインドウのコンテンツをウインドウコントローラによって管理します(ウインドウを読み込む、表示する、閉じるなど)。SwiftUIではシーンを使用してウインドウを管理し、AppKitではNSWindowControllerオブジェクトを使用します。
Auto Layout
フルスクリーンモードや異なるウインドウのサイズに合わせてビューの位置を手動で調整するのではなく、現在のセーフエリアに基づいてシステム側で調整しましょう。SwiftUIには、UI設計アプローチの一部としてAuto Layoutが用意されています。AppKitビューにAuto Layoutを採用する場合は、インターフェイスにAuto Layout制約を追加します。
外観のバリエーション
UIをシステムレベルの外観変更に対応させましょう。ダークモードにより、ユーザーはUIをライトモードとダークモードのいずれかで表示でき、アクセシビリティ設定ではハイコントラストのUIを選択できます。異なる外観には異なるカラーパレットと画像アセットを使用しますが、これらのアセットはアセットカタログを利用して管理します。UIのその他の部分については、システムAPIを使用して表示モード(ライトモードとダークモードのいずれか、またはハイコントラストでコンテンツの表示)を変更するタイミングを決めることができます。詳細は、「インターフェイスをダークモードに対応させる」をご参照ください。
テキストスタイル
アプリのテキストには、テキストスタイルおよび動的なフォントバリアントを使用します。テキストスタイルは、個々のテキストの意味的な区分を定義します(たとえば「本文」スタイルは主要コンテンツを定義)。テキストスタイルのフォント特性はフォントサイズを変更しても変化しないため、テキストの拡大縮小表示が可能となり、アプリにおいて意図した外観も維持できます。インターフェイスのメニュー、ツールチップ、特定の要素に動的なフォントバリアントを使用すると、標準UI要素の外観との一貫性を維持できます。使用方法については「タイポグラフィ」をご参照ください。
スケーラブルな画像
アプリにSF Symbolsを取り入れることで、変更に対して柔軟に対応することができます。SF Symbolsアプリには、膨大な数の設定可能なベクターベースの画像が収録されており、これらの画像は外観やサイズの変更に自然に適応します。また、システムフォント「San Francisco」とも調和するため、Appleの各種プラットフォームでの一貫性も維持されます。「UIのシンボル画像を構成および表示する」をご参照ください。
ドキュメントやファイルを適切に処理する
macOSでは、ユーザーがファイルシステムに直接アクセスでき、Finderやターミナルアプリを使用してファイルを追加、削除、移動、調査することができます。ユーザーがファイルにアクセスできるようにするためのテクノロジーに対応し。また、アプリ以外の場所で実行された変更による影響をアプリが受けないようにします。
iCloud Driveを使用してデバイス間でファイルを共有する
ドキュメントやファイルをiCloudに保存するオプションを用意することにより、ユーザーが所有するすべてのデバイスからファイルにアクセスできるようになります。サイズが小さいデータは、iCloud Key-Value Storageを使用して共有します。
プライベートファイルをアプリのコンテナディレクトリに保存する
アプリが、中間ファイル、キャッシュ、およびユーザーに変更されたくないその他のコンテンツを生成する場合は、それらのファイルをアプリのコンテナディレクトリに保存します。コンテナには、適切に定義されたコンテンツ用の場所が用意されており、表示もされないため、ユーザーによる意図しないコンテンツ変更を防止できます。
カスタムファイル形式に対応したクイックルックプレビューを用意する
クイックルックでは、ファイルを開くことなくその内容をFinderで簡単に確認できます。定義するすべてのカスタムドキュメント形式に対して、クイックルックのプラグインを用意しましょう。詳細は、「QuickLookUI」をご参照ください。
アプリがファイルベースのドキュメントに対応する場合は、ドキュメント編集をスムーズに実行できるようにします。ドキュメントコンテンツは、SwiftUIのドキュメント型またはAppKitのNSDocument型を使用して作成します。アプリの編集コードに「取り消す」および「やり直す」を導入して、ユーザーが編集時に操作ミスした場合にそれを修正できるようにします。ユーザーがドキュメントに加えた変更内容の消失を避けるため、自動保存機能も追加します。詳細は、「ドキュメントベースのアプリを開発する」をご参照ください。
開発にあたってのベストプラクティス
以下のベストプラクティスを実践し、すべてのユーザーにとってベストな体験を提供しましょう。
ユーザーのプライバシーを保護する
プライバシーは重要なため、ユーザーのデータがどのように使用されるかを明確にする必要があります。データを収集する場合は、その情報がどのように使用されるかを説明する、プライバシーに関する声明を表示するようにします。個人データを利用するAppleテクノロジーを採用する場合、データの初回利用時に、データの使用用途に関する説明をシステム上で表示してください。詳細は、「ユーザーのプライバシーを保護する」をご参照ください。
収集および保存したデータを保護する
データを収集する場合は必ず、悪意ある攻撃からそのデータを保護してください。パスワードに代わるセキュリティ対策としてパスキーを採用します。個人識別情報、金銭に関するデータ、機密性の高いその他のデータは、ユーザーの暗号化されたキーチェーンに保存します。その他の個人データは、ディスク上の暗号化テクノロジーやその他のAppleのセキュリティテクノロジーを使用して保存します。ローカルに保存するデータやアプリの外部に送信するデータは、AppleのCryptoKitを使用して暗号化します。
アクセシビリティへの対応を検証する
Appleのテクノロジーにはアクセシビリティへのサポートが組み込まれていますが、画面読み上げ機能やその他のアクセシビリティ機能は、アプリから提供される情報に依存します。SwiftUIおよびAppKitでは各UI要素を定義することはできますが、それらのUI要素がどのように相互に連携するかはデベロッパ次第です。アクセシビリティラベルおよびその他の説明をレビューし、それらが有益な情報を提供すること、およびフォーカスベースのナビゲーションがシンプルで直感的になっていることを確認してください。詳細は、「アクセシビリティ」をご参照ください。
アプリを国際化およびローカライズする
グローバルな市場を視野に入れ、アプリをローカライズして異なる地域や言語に対応させましょう。アプリをローカライズできるよう、異なる言語や地域向けに文字列、日付、時刻、通貨、数字をフォーマットするためのコードが提供されているFoundationフレームワークを使用します。左から右に書く言語と右から左に書く言語の両方において、UIが適切に表示されるよう対応させてください。アプリのリソースは、ローカライズしてXcodeのプロジェクトに追加します。インターナショナライゼーションとローカリゼーションのプロセスに関する情報は、「ローカリゼーション」をご参照ください。
あらゆるユーザーを考慮して設計する
コンテンツを作成する際は社会的および文化的な違いを考慮し、特定のユーザーに対してネガティブまたは軽蔑的なニュアンスを持つ画像や用語の使用を避けてください。詳細は、「インクルージョン」をご参照ください。
アプリを徹底的にテストおよびデバッグする
開発サイクルでは、問題が発生すると同時に、組み込まれているXcodeデバッガを使用してデバッグを行います。XCTestを使用して自動テストスイートを作成し、ビルドするたびに毎回テストを実行して、新しいコードが想定通りに機能することを確認します。Xcode Cloudの継続的インテグレーションシステムを使用して、ビルド、テストサイクル、QAチームへのアプリの配信を自動化します。
アプリのパフォーマンスを最適化する
Xcodeに付属するInstrumentsアプリを使用して、コードのボトルネックやパフォーマンスに関するその他の問題を特定します。このアプリでは、実行コードのプロファイル取得、メモリリークの検出、リソース使用状況の分析などが可能です。Instrumentsアプリを使用して測定値を収集する方法については、「アプリのパフォーマンスを向上させる」をご参照ください。
アプリのビジネスモデルを選択する
「無料」、「無料(アプリ内課金あり)」、「有償でダウンロード」などのビジネスモデルを使用して、アプリを全世界に配信しましょう。インターフェイスを構築する際は、統一感のある体験を提供し、選択したビジネスモデルに対応するインターフェイスを心がけてください。詳細は、「ビジネスモデルの選択」をご参照ください。
さらにその先へ
アプリをビルドし、実行できることを確認したら、その体験を向上させる方法を検討しましょう。特定の機能を追加したり、コンテンツを別の方法で表示したりするなどの小さな変更を加えることで、大きな違いをもたらすこともあります。たとえば、次の内容を検討します。
アプリのコンテンツを簡単に検索できるようにする
アイテムに関する包括的な説明を追加して、Spotlight検索でより簡単に検出できるようにします。用意されているユーザアクティビティオブジェクトを使用し、ユーザーが検索結果を選択した際に、アプリを適切な状態にして結果を表示するようにします。
新しい機能に対してランタイム条件チェックを追加する
macOSの新しいバージョンに対応させるためにアプリをアップデートする際は、新しい機能のコードに対してランタイム条件チェックを追加します。ランタイムチェックにより、アプリの異なるバージョン(新しいmacOS用バージョンと古いmacOS用バージョン)を配信する必要性を排除できます。同じバージョンのアプリを実行するユーザーのうち、新しいmacOSを使用しているユーザーは、追加された新機能を利用できるようになります。ランタイムチェックを追加する方法については、「特定バージョンのプラットフォームやOSでコードを実行する」をご参照ください。
開発したコンテンツとのインタラクションに対応する手段は、アプリだけに限定されません。以下のテクノロジーを採用することにより、システムのその他のエリアまでアプリの連携範囲を拡大することができます。
コンテンツを他のシステムサービスと統合する
システムの一部はアプリ固有の情報に対応し、App Extensionを使用してその情報を収集します。Widget Extensionを追加すると、通知センターにアプリのコンテンツを表示させることが可能になり、Action Extensionを追加すると、アプリのクイックアクションを定義できます。対応するApp Extensionについては、「App Extension」をご参照ください。
アプリのコンテンツをユニバーサルリンクに対応させる
Webサイトとアプリで同様のコンテンツを提供する場合は、アプリをユニバーサルリンクに対応させます。ユニバーサルリンクを使用すると、アプリのコンテンツを開くためのURLを別途作成する必要がなくなります。1つのURLにより、アプリがインストールされている場合はアプリが起動し、インストールされていない場合はWebサイトが開きます。詳細は、「コンテンツへのリンクをアプリとWebサイトに許可する」をご参照ください。
別のアプリで役に立つ機能をエクスポートする
macOSの「サービス」メニューには、選択されている内容に対してユーザーが実行できるタスクが表示されます。アプリに搭載したタスクをこのメニューに反映させ、実行時にこれらのサービスを実行するためのコードを作成します。詳細は、「サービス実装ガイド」をご参照ください。
一部のアプリでは、カスタムハードウェアとの通信が必要になる場合や、システムレベルのサービスやセキュリティ機能を可能にするためにシステムを拡張する必要がある場合があります。以下のいずれかの機能に対応させる場合は、アプリにSystem Extensionを追加することを検討してください。
不正操作の可能性があるイベントを監視する
たとえば、プロセスの実行やフォーク、ファイルシステムのマウント、信号の発信などを監視する場合です。詳細は、「エンドポイントセキュリティ」をご参照ください。
コアネットワーク機能をカスタマイズまたは拡張する
たとえば、システムのWi-Fi設定を変更する、VPN構成を作成して管理する、コンテンツフィルタリングを実行する、システム全体のDNS構成を管理する、カスタムのインターネット共有環境を統合する場合などです。詳細は、「Network Extension」をご参照ください。
カスタムハードウェアと直接通信する
たとえば、外付けのUSBデバイス、HIDデバイス、PCIデバイス、シリアル接続デバイスなど、多様なデバイスとの通信を行う場合です。詳細は、「DriverKit」をご参照ください。
その他のリソース
独自の機能を提供すると同時に、Appleのプラットフォームと緊密に統合する各種テクノロジーを確認しましょう。これらのテクノロジーにより、iOS、iPadOS、macOS、tvOS、visionOS、watchOSの全プラットフォームにわたって、アプリとゲームのシームレスなエコシステムを実現できます。