🐒

MacのインストーラーにPaneを追加する(Installer Plug-in)

2024/11/02に公開

はじめに

XcodeのInstaller Plug-inテンプレートを使ってみたかったので、その備忘録として記載します

やらないこと

pkgbuildコマンド、productbuildコマンドの説明

完成イメージ


手順

Installer Plug-inのテンプレートを作成

テンプレートプロジェクトでInstaller Plug-inを選択
Product Nameなどを入力し、プロジェクトを作成
※Product NameはMyAppとしています。

Paneを編集

テンプレートプロジェクトをカスタマイズしていきます。
今回はシンプルに、下記の変更を行います。
・Interface Builderで、Paneにラベルを表示
・Pane表示イベントを拾い、ダイアログを表示
・InstallerSections.plistを編集し、Paneの出す位置を変更

ラベルを追加

ダイアログ表示

#import "MyInstallerPane.h"

@implementation MyInstallerPane

- (NSString *)title
{
    return [[NSBundle bundleForClass:[self class]] localizedStringForKey:@"PaneTitle" value:nil table:nil];
}

# 追加部分(didEnterPaneイベントを使用)
- (void)didEnterPane:(InstallerSectionDirection)dir
{
    NSAlert *alert = [[NSAlert alloc] init];
    [alert setMessageText:@"hoge"];
    [alert addButtonWithTitle:@"OK"];
    [alert runModal];
}

@end

Installersections.plist

最初に表示されるようにMyApp.bundleのOrderを変更しています

プラグインのExport

Built Productsを選択し、BundleファイルをExport

Bundleファイルと同じ階層に、InstallerSections.plistを配置

以下のような構成にしています

├── App
│   └── <インストールするアプリ>
├── Distribution
│   └── Distribution.xml
├── Packages
├── Plugins
│   ├── InstallerSections.plist
│   └── MyApp.bundle
└── Scripts
    ├── postinstall
    └── preinstall

pkgファイルを作成

pkgbuild --root ./App --identifier <Indentifir> --version 1.0 --install-location /Applications --scripts Scripts ./Packages/MyApp.pkg

distribution形式のpkgファイルを作成

productbuild --distribution ./Distribution/Distribution.xml --package-path ./Packages --plugins ./Plugins ./Packages/MyPackage.pkg

作成されたMyPackage.pkgがプラグイン追加後のパッケージとなります。

終わりに

インストーラーについて、事前にShellScriptを動かせたり、既存のPaneをHTMLで置き換えたり、結構カスタマイズできる部分があります
参考になれば幸いです

Discussion