macOSアプリでアプリケーション(パッケージ)内に、追加オプションなどのインストーラパッケージ(pkg)を内包させることがあります。このときに注意するべきは、アプリケーション内のどのディレクトリにインストーラパッケージを配置するかです。
アプリケーションパッケージ内のファイルの配置場所
アプリケーションパッケージ内に配置するファイルは、ガイドラインで定められているディレクトリ構成に従って、適切なディレクトリに配置する必要があります。配置ディレクトリが間違っていると、GateKeeperのコードサイニングが失敗してしまったり、Apple Notary Serviceで公証(Notarize)が拒否されてしまいます。
次のようなディレクトリが定義されています。
ディレクトリ | 説明 |
---|---|
Contents | アプリケーションパッケージ(バンドル)の最上位ディレクトリ |
Contents/MacOS | アプリケーション本体、ヘルパーアプリ、コマンドラインツール、実行ファイル |
Contents/Frameworks | フレームワーク、及び、dylib(ダイナミックライブラリ) |
Contents/PlugIns | プラグイン、及び、エクステンション |
Contents/XPCServices | XPCサービス |
Contents/Helpers | ヘルパーアプリ、コマンドラインツール、実行ファイル |
Contents/Library/Automator | Automatorのアクション |
Contents/Library/Spotlight | Spotlightのインポーター |
Contents/Library/LoginItems | ログイン項目 |
Contents/Library/LaunchServices | ServiceManagementフレームワークによってインストールされる特権付与ヘルパーツール |
Contents/Resources | リソースファイル |
また、配置されるフレームワークやヘルパーアプリなど、バンドル形式になっているものは、それらについても適切なディレクトリ構成及びファイル配置になっている必要があります。
参考資料
インストーラパッケージの配置場所
インストーラパッケージですが、Notarize可能なものはフラットファイル形式です。インストーラパッケージは実行ファイル(コード)のようにも見えますが、実体はInstaller.app
が読み込んで使用するアーカイブファイルの一種です。
そのため、適切な配置先はContents/Resources
ディレクトリです。
Xcodeでの設定
インストーラパッケージをContents/Resources
ディレクトリにコピーするように設定します。インストーラパッケージはインストーラ証明書で署名されています。アプリケーションビルド時にアプリケーション証明書で再署名されないようにするため、以下の操作を行います。
プロジェクトにインストーラパッケージを追加すると、Xcodeが自動的に「Copy Bundle Resources」フェーズにインストーラパッケージを追加します。
インストーラパッケージをContents/Resources
ディレクトリにコピーするときに、コードサイニングされないように、チェックを外します。
動作確認
公証の仕様は変わる事がありますが、2023年12月7日時点では、Contents/Resources
にインストーラパッケージ(pkg)ファイルを配置して、以下の一連の処理が成功することを確認しました。
- コードサイニング
- 公証
- ステープル
- Webサーバーに配置し、Safariでダウンロードして、Finderで開いて実行