如何将自定义Installer Plugin与productbuild/pkbuild构建的.pkg绑定?
自定义Installer Plugin集成到pkg的正确流程
针对你用productbuild/pkgbuild打包时无法集成自定义文本输入插件的问题,以下是可落地的解决步骤:
1. 确认插件bundle的正确性
先确保你的Xcode插件项目配置无误:
- Info.plist中
CFBundlePackageType必须设为BNDL NSPrincipalClass要指定继承自InstallerPane的主类- 构建后的
.bundle文件单独放在一个目录,比如./InstallerPlugins/MyInputPanel.bundle
2. 调整基础pkg的结构(核心步骤)
插件不是要安装到用户系统的组件,不能用pkgbuild --component打包,必须放到最终pkg的Contents/Plugins目录下:
- 先按原脚本生成基础组件pkg(比如
base.pkg) - 解压基础pkg到临时目录:
pkgutil --expand base.pkg ./temp_pkg - 在
./temp_pkg/Contents下创建Plugins文件夹,把你的插件bundle复制进去 - 重新打包临时目录为带插件的基础pkg:
pkgutil --flatten ./temp_pkg ./base_with_plugin.pkg
3. 修改Distribution.xml关联插件
在你的Distribution.xml中做两处修改:
- 在
<installer-gui-script>节点内添加插件声明(路径对应Contents/Plugins下的bundle):<bundle id="com.yourdomain.MyInputPanel" path="./MyInputPanel.bundle"/> - 在
<choices-outline>中添加插件面板的加载顺序,比如放在许可协议之后:<line choice="com.yourdomain.MyInputPanel"/>
注意:插件bundle的CFBundleIdentifier必须和这里的id完全一致。
4. 生成最终安装包
调用productbuild时,指定修改后的Distribution.xml和带插件的基础pkg:
productbuild --distribution ./Distribution.xml --package-path ./ ./final_installer.pkg
验证方法
如果无法查看pkg内容,可用以下方式确认插件是否被加载:
- 运行命令查看安装器的选择项XML,检查插件id是否存在:
installer -pkg final_installer.pkg -target / -showChoicesXML - 直接运行安装包,确认自定义文本输入面板正常显示
额外注意事项
- 插件的签名必须和安装包的签名一致,否则公证后的安装器会拒绝加载插件
- 确保插件Info.plist中设置了
InstallerPaneTitle等必要键,保证面板正常显示标题
内容的提问来源于stack exchange,提问作者vuzzie
相关产品推荐
相关产品推荐

