macOS で署名済みインストーラ (pkg) を作る方法

最近弊社ではひょんなことから音楽制作ソフトウェアのプラグイン形式であるAudio Unit、VSTプラグインの開発を行っています。プラグインの配布はアプリとは違って自社のWebサイトで行うことが多く、macOS用の配布にはひと工夫必要です。この記事では、macOSで署名済みのインストーラ(pkg)を作成する手順を、具体的なコマンドと共に詳しく説明します。

はじめに

音楽制作ソフトウェアのプラグイン形式であるAudio Unit v2やVST 3はそれぞれ.component、.vst3という形式になっており、通常のアプリの配布とは異なります。

iOSではアプリの配布時にXcodeを使ってArchiveするとそのままAppStoreConnectへアップロードすることができました。しかし、プラグインは一般的に自社のWebサイトなどで直接配布されます。また、インストーラの作成と署名はXcode上でできません。

署名済みインストーラを作るには3つのステップがあります。

  1. 署名されたバイナリをビルド
  2. 署名されたインストーラ (pkg)を生成
  3. Appleのサーバにインストーラを送信して公証を行う

また、必要な証明書が二種類あります。

  • Developer ID Application: バイナリのビルド時に署名を行う証明書
  • Developer ID Installer: インストーラの生成時に署名を行う証明書

1. 署名されたバイナリをビルド

署名時にエラーが起きないよう、OTHER_CODE_SIGN_FLAGSに--timestampを指定します。リリースビルドにチームと、Developer ID Applicationの証明書を設定します。xcodebuildを使う場合は下記のように指定することができます。

# APPLE_TEAM_ID は自分のものを指定
xcodebuild -project MyPlugin.xcodeproj -scheme MyPlugin -configuration Deployment build DEVELOPMENT_TEAM=$APPLE_TEAM_ID OTHER_CODE_SIGN_FLAGS="--timestamp"

パスの探し方

Xcode上でビルドした場合はProductsから見つけることができますが、xcodebuildでビルドした場合、成果物のパスはビルドログから、または下記のスクリプトで取得することができます。

CONFIGURATION_BUILD_DIR=$(xcodebuild -project MyPlugin.xcodeproj -scheme MyPlugin -configuration Deployment -showBuildSettings | grep -m 1 "CONFIGURATION_BUILD_DIR" | grep -oEi "\/.*")
BUILD_COMPONENT_PATH=$CONFIGURATION_BUILD_DIR/MyPlugin.component

2. 署名されたインストーラを生成

pkgファイルを生成する際には、ビルドしたバイナリファイルを指定し、適切なインストールパスを設定します。また、このプロセスでは「Developer ID Installer」証明書を使用して署名を行います。

# BUILD_COMPONENT_PATH は .component のパス
# CERT_ID_NAME は "Developer ID Installer: covelline, LLC. (XXXXXX)" のような文字列
pkgbuild --component $BUILD_COMPONENT_PATH --install-location "/Library/Audio/Plug-Ins/Components" --sign "$CERT_ID_NAME" --timestamp MyPluginAU.pkg

3. Appleのサーバにpkgを送信して公証を行う

作成したpkgファイルをAppleに送信し、公証を受けます。これにより、ユーザーがインストーラを開いた際にセキュリティの警告がでないようになります。

下記のコマンドを実行することで、公証プロセスを開始し、完了後には「stapler」を使用して証明書をpkgに埋め込みます。

# APPLE_ID はメールアドレス
# APPLE_PASSWORD は App Specific Password ("xxxx-xxxx-xxxx-xxxx" のような文字列)
xcrun notarytool submit MyPluginAU.pkg --apple-id "$APPLE_ID" --password "$APPLE_PASSWORD" --team-id "$APPLE_TEAM_ID" --wait
xcrun stapler staple MyPluginAU.pkg

おわりに

Audio Unit v2を例に、macOSで署名済みのインストーラ(pkg)を作成する方法を説明しました。iOS アプリ開発には慣れていましたが、コマンドラインでの作業が多く、インストーラとバイナリにそれぞれ異なる証明書を使うことなど、わかりにくいことが多かったです。一度手順がわかってしまえば簡単で、CI への組み込みもできました。別の機会に VST/AU プラグインを GitHub Actions で Windows と macOS 向けそれぞれにビルドする方法を説明したいと思います。