記事


コンテンツをバンドル内に配置


バンドルコンテンツをその型に基づいて適切な場所に配置します。





概観


バンドル は、標準化された階層構造を持つディレクトリで、通常は実行可能コードとそのコードで使用されるリソースが含まれます。バンドルはさまざまな役割を果たします。アプリ、アプリ拡張機能、フレームワーク、そしてプラグインはすべてバンドルです。バンドルには他のバンドルを含めることもできます。たとえば、アプリにはアプリ拡張機能を含めることができます。


バンドルには、コンテンツを保持するための標準的な場所のセットがあります。バンドル内でコンテンツを配置する適切な場所は、コンテンツの種類によって異なります。たとえば、アプリ拡張機能はプラグイン用に予約されている場所に、ストーリーボードはリソース用に予約されている場所に配置しなければなりません。すべての場所がすべてのプラットフォームに適しているわけではなく、同様に、すべてのプラットフォームがすべてのコンテンツの種類をサポートしているわけではありません。


Xcode はバンドル構造を理解して、Xcode を使用してあなたのバンドルをビルドすると、そのタイプに基づいてコンテンツが正しく配置されます。ソフトウェア製品のビルドに Xcode を使用しない場合は、以下の情報を使用してバンドルされたコンテンツを適切な場所に配置してください。Xcode を使用する場合でも、製品の最終的な構造を確認するときにこの情報が役立つ場合があります。


重要

コンテンツを間違った場所に置くと、デバッグが難しいコード署名や配布の問題が発生する可能性があります。これらの問題は、必ずしもすぐに明らかになるわけではありません。たとえば、Mac アプリを構築する場合、間違って配置されたコードは日常の開発では機能するかもしれませんが、公証時に問題を引き起こす可能性があります。

種類とプラットフォームに基づいてコンテンツを配置


バンドルされたコンテンツには、バンドルの Info.plist、コード コンテンツ、リソースが含まれます。


  • Info.plist は、ディレクトリ階層をバンドルとして識別する場所に保存されるプロパティリストファイルです。Info.plist キーのリストについては、情報プロパティリスト (Information Property List) を参照してください。

  • コードコンテンツは、ヘルパーツールなどの実行可能コード、またはアプリ拡張機能などの実行可能コードを含む別のバンドルのいずれかです。このコンテキストでは、実行可能コードとは Mach-O イメージを意味します。シェルスクリプト、Python スクリプト、AppleScript などは含まれません (AppleScript をアプリケーションとして保存しない限り)。スクリプトを実行しても、コード署名を保持する場所がないため、リソースとして扱って下さい。

  • リソースは、コード以外のすべてです。

  • バンドルにコンテンツを追加するときは、以下の表のルールに従って配置します。


  • 場所がスラッシュ (/) で終わる場合は、そのディレクトリ内にアイテムを配置します。それ以外の場合は、その場所にその型のアイテムを 1 つ配置します。

  • 場所が / の場合は、バンドルのルートを示します。
  • macOS プラットフォームは、Mac アプリと Mac Catalyst アプリの両方をカバーします。

  • コンテンツの種類プラットフォーム場所
    Info.plistmacOSContents/Info.plist
    macOS フレームワークVersions/A/Resources/Info.plist
    iOS, watchOS, tvOS, visionOSInfo.plist
    main 実行可能macOSContents/MacOS/
    macOS フレームワークVersions/A/
    iOS, watchOS, tvOS, visionOS/
    リソースmacOSContents/Resources/
    macOS フレームワークVersions/A/Resources/
    iOS, watchOS, tvOS, visionOS/
    プライバシーマニフェストmacOSContents/Resources/
    macOS フレームワークVersions/A/Resources/
    iOS, watchOS, tvOS, visionOS/
    フレームワーク,ダイナミックライブラリmacOSContents/Frameworks/
    macOS フレームワークVersions/A/Frameworks/
    iOS, tvOS, visionOSFrameworks/
    watchOS以下の watchOS でのフレームワークと
    Swift システムライブラリの処理
    セクションを参照せよ。
    アプリ拡張機能macOSContents/PlugIns/
    iOS, watchOS, tvOSPlugIns/
    plug-inmacOSContents/PlugIns/
    macOS フレームワークVersions/A/PlugIns/
    iOS, watchOS, tvOS, visionOSPlugIns/
    provisioning profilemacOSContents/embedded.provisionprofile
    iOS, watchOS, tvOS, visionOSembedded.mobileprovision
    ヘルプアプリ、ヘルパーツールmacOSContents/MacOS/
    Contents/Helpers/
    macOS フレームワークVersions/A/Helpers/
    XPC ServicemacOSContents/XPCServices/
    Automator actionmacOSContents/Library/Automator/
    QuickLook generatormacOSContents/Library/QuickLook/
    特権ヘルパーツールmacOSContents/Library/LaunchServices/
    サービス管理ログイン項目macOSContents/Library/LoginItems/
    Spotlight importermacOSContents/Library/Spotlight/
    system 格調機能macOSContents/Library/SystemExtensions/
    アプリクリップiOSAppClips/
    watchOS appiOSWatch/


    iOS、watchOS、tvOS はサードパーティのフレームワークをサポートしていますが、サードパーティのスタンドアロン動的ライブラリはサポートしていません。これはフレームワークバンドル外のもので、通常は .dylib ファイル名拡張子を持ちます。このルールの唯一の例外は、Xcode によって提供される Swift システムライブラリです。


    iOS と tvOS は、最上位のアプリレベルでフレームワークと Swift システムライブラリをサポートしています。アプリ拡張機能などのネストされたバンドルにはフレームワークを含めることはできません。


    watchOS にフレームワークと Swift システムライブラリを埋め込む方法の詳細については、watchOS でのフレームワークと Swift システムライブラリの処理 を参照してください。


    リソースのローカライズの詳細については、バンドル内のローカライズされたリソース (Localized Resources in Bundles) を参照してください。


    watchOS でのフレームワークと Swift システムライブラリの処理


    watchOS アプリは、watchOS アプリを含む iOS アプリと、WatchKit 拡張機能を含む iOS アプリで構成されています。このネストは、ウォッチ専用アプリの場合でも存在します。watchOS アプリにフレームワークと Swift システムライブラリを埋め込む場合は、以下の操作を行う必要があります。


  • iOS フレームワークと Swift システムライブラリを iOS アプリの Frameworks ディレクトリに配置します。たとえば、MyApp という iOS アプリの場合、iOS フレームワークと Swift システムライブラリを MyApp.app/Frameworks/ に配置します。

  • watchOS Swift システムライブラリを WatchKit アプリの Frameworks ディレクトリに配置します (例えば: MyApp.app/Watch/MyApp WatchKit App.app/Frameworks/)。

  • watchOS フレームワークを WatchKit 拡張機能の Frameworks ディレクトリに配置します (例えば: MyApp.app/Watch/MyApp WatchKit App.app/PlugIns/MyApp WatchKit Extension.appex/Frameworks/)。

  • macOS で単一のフレームワークバージョンをサポート


    macOS フレームワークは、独自の形式を使用するバンドルです。フレームワークのルートには、フレームワークの 1 つ以上のバージョンを保持する Versions ディレクトリが含まれており、各バージョンは独自のバンドルのような構造を持っています。macOS の祖先プラットフォームでは、このバージョンのバンドル内にフレームワークの複数のバージョンが共存できます。ただし、macOS では、A という名前の単一のバージョンを使用するのがベストプラクティスです。


    Xcode で macOS フレームワークをビルドすると、正しい構造が自動的に生成されます。Xcode の外部で作業している場合は、互換性を最大限に高めるために、以下のルールに従ってフレームワークを構造化してください。


    1. フレームワークのルートに 1 つの Versions ディレクトリを作成します。

    2. その中に、A と言う名前のディレクトリを作成します。

    3. Versions/A にフレームワークのコンテンツを入力します。

    4. A をターゲットとする Current という Versions 内にシンボリックリンクを作成します。

    5. Versions/Current を介してフレームワークの実行可能ファイルをターゲットとする、フレームワークのルート内にシンボリックリンクを作成します。たとえば、CoreWaffleVarnishing フレームワークを作成する場合は、Versions/Current/CoreWaffleVarnishing にフレームワークの実行可能ファイルをターゲットとする、CoreWaffleVarnishing というシンボリックリンクを作成します。

    6. Versions/Current を介してフレームワークの Resources ディレクトリをターゲットとする、フレームワークのルート内にシンボリックリンクを作成します。

    7. 必要に応じて、Versions/Current を通じて同様の名前の項目をターゲットとする他のシンボリック リンクをルートに作成します。

    最終的な構造は以下のようになります。


    1. CoreWaffleVarnishing.framework/
    2.   CoreWaffleVarnishing -> Versions/Current/CoreWaffleVarnishing
    3.   Resources -> Versions/Current/Resources
    4.   Versions/
    5. Current -> A
    6. A/
    7. CoreWaffleVarnishing
    8. Resources/
    9. Info.plist
    10. … other resources …

    重要

    フレームワークのルートには、Versions ディレクトリとシンボリックリンクのみを含めなければなりません。そこには他のコンテンツは配置しないでください。配置すると、コード署名の問題が発生します。同様に、Versions ディレクトリには、バージョンディレクトリ (理想的には A という 1 つのバージョンディレクトリのみ) と、1 つのバージョン ディレクトリをターゲットとする Current というシンボリックリンクのみを含めなければなりません。

    コードコンテンツを直接その場所に配置


    各コードの場所には、コードコンテンツのフラットなリストが含まれていなければなりません。コードコンテンツが大量にある場合は、例えば以下のようにネストされたディレクトリにグループ化したくなるかもしれません。


    1. WaffleVarnisher.app/
    2.   Contents/
    3. PlugIns/
    4. Waffles/
    5. Belgian.plugin
    6. Buttermilk.plugin
    7. BananaCaramel.plugin
    8. Varnishes/
    9. Gloss.plugin
    10. Satin.plugin
    11. Matte.plugin

    ネストされたあなたのコードをこのようにグループ化しないでください。状況によっては機能するかもしれませんが、後でデバッグが困難な方法で失敗する可能性があります。


    この推奨事項を無視してこの構造を使用する場合は、上記の例の WafflesVarnishes のように、ディレクトリ名にドット (.) を使用しないでください。コード署名機構は、名前にドットが含まれるディレクトリはすべてバンドルであると想定し、そのディレクトリの署名時に、形式に沿ったバンドルではないために失敗します。


    コードのないバンドル


    コードのないバンドルには実行可能なコードがありません。たとえば、一部のアプリでは、プラグインサポートの一部としてコードのないバンドルを使用します。コードのないバンドルにはコード署名を保持できるため、状況に応じてコードまたはリソースとして署名できます。


  • コードのないバンドルを単独で配布する場合は、コードとして署名して下さい。

  • コードのないバンドルを別のバンドル内に埋め込む場合、埋め込み場所に通常コードが含まれている場合は (Contents/PlugIns など)、コードとして署名して下さい。それ以外の場合は、コードのないバンドルをリソースとして署名します。













  • トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ