アプリケーション内にインストーラーパッケージを内包させたときの公証

macOSアプリでアプリケーション(パッケージ)内に、追加オプションなどのインストーラパッケージ(pkg)を内包させることがあります。このときに注意するべきは、アプリケーション内のどのディレクトリにインストーラパッケージを配置するかです。

目次

アプリケーションパッケージ内のファイルの配置場所

アプリケーションパッケージ内に配置するファイルは、ガイドラインで定められているディレクトリ構成に従って、適切なディレクトリに配置する必要があります。配置ディレクトリが間違っていると、GateKeeperのコードサイニングが失敗してしまったり、Apple Notary Serviceで公証(Notarize)が拒否されてしまいます。

次のようなディレクトリが定義されています。

ディレクトリ説明
Contentsアプリケーションパッケージ(バンドル)の最上位ディレクトリ
Contents/MacOSアプリケーション本体、ヘルパーアプリ、コマンドラインツール、実行ファイル
Contents/Frameworksフレームワーク、及び、dylib(ダイナミックライブラリ)
Contents/PlugInsプラグイン、及び、エクステンション
Contents/XPCServicesXPCサービス
Contents/Helpersヘルパーアプリ、コマンドラインツール、実行ファイル
Contents/Library/AutomatorAutomatorのアクション
Contents/Library/SpotlightSpotlightのインポーター
Contents/Library/LoginItemsログイン項目
Contents/Library/LaunchServicesServiceManagementフレームワークによってインストールされる特権付与ヘルパーツール
Contents/Resourcesリソースファイル
アプリケーションパッケージ内のディレクトリ構造

また、配置されるフレームワークやヘルパーアプリなど、バンドル形式になっているものは、それらについても適切なディレクトリ構成及びファイル配置になっている必要があります。

参考資料

インストーラパッケージの配置場所

インストーラパッケージですが、Notarize可能なものはフラットファイル形式です。インストーラパッケージは実行ファイル(コード)のようにも見えますが、実体はInstaller.appが読み込んで使用するアーカイブファイルの一種です。

そのため、適切な配置先はContents/Resourcesディレクトリです。

Xcodeでの設定

インストーラパッケージをContents/Resourcesディレクトリにコピーするように設定します。インストーラパッケージはインストーラ証明書で署名されています。アプリケーションビルド時にアプリケーション証明書で再署名されないようにするため、以下の操作を行います。

STEP
プロジェクトにインストーラパッケージを追加する。
STEP
「Copy Bundle Resources」フェーズからインストーラパッケージを削除する。

プロジェクトにインストーラパッケージを追加すると、Xcodeが自動的に「Copy Bundle Resources」フェーズにインストーラパッケージを追加します。

STEP
ビルドフェーズに「Copy Files Phase」を追加する。
STEP
「Destination」を「Resources」に設定する。
STEP
「Code Sign On Copy」のチェックを外す。

インストーラパッケージをContents/Resourcesディレクトリにコピーするときに、コードサイニングされないように、チェックを外します。

動作確認

公証の仕様は変わる事がありますが、2023年12月7日時点では、Contents/Resourcesにインストーラパッケージ(pkg)ファイルを配置して、以下の一連の処理が成功することを確認しました。

  • コードサイニング
  • 公証
  • ステープル
  • Webサーバーに配置し、Safariでダウンロードして、Finderで開いて実行

関連性が高い記事

著書紹介

Authored Books

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Akira Hayashi (林 晃)のアバター Akira Hayashi (林 晃) Representative(代表), Software Engineer(ソフトウェアエンジニア)

アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note, Medium, LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note, Medium, LinkedIn

目次