Mac OS PKG安装器自定义Summary页面的问题咨询
我完全懂你想替换PKG安装器默认Summary(也就是FinishUp)页面的需求,之前折腾自定义安装器页面的时候也踩过一模一样的坑——明明注释掉了FinishUp,结果默认页面和自定义页面一起冒出来,太闹心了。咱们来一步步拆解问题出在哪,以及怎么解决:
为什么你的现有配置没生效?
Apple的Installer框架有个“小脾气”:如果它检测到你的安装流程里没有一个标记为Finish类型的页面,就会自动追加默认的FinishUp页面。你的MyFinishUp.bundle只是被当成了一个普通的额外页面,所以安装器就同时加载了它和默认的Summary页面,这就是两个页面都显示的原因。
解决步骤
1. 给自定义Bundle标记正确的类型
首先要让Installer知道你的MyFinishUp.bundle是用来替换默认FinishUp的,这需要在bundle的Info.plist里添加一个关键配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <!-- 其他必填的Bundle配置 --> <key>CFBundleIdentifier</key> <string>com.yourcompany.MyFinishUp</string> <key>CFBundleName</key> <string>MyFinishUp</string> <key>NSPrincipalClass</key> <string>MyFinishUpViewController</string> <!-- 你的页面控制器类 --> <!-- 关键:标记为Finish类型 --> <key>InstallerSectionType</key> <string>Finish</string> </dict> </plist>
这个InstallerSectionType = Finish是核心,告诉安装器“这个页面就是最终的Summary/Finish页面,别再加载默认的了”。
2. 修正InstallerSections.plist配置
你不需要注释掉FinishUp(反正安装器也会自动补),只要确保你的自定义bundle在SectionOrder里的正确位置即可,修正后的配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>SectionOrder</key> <array> <string>Introduction</string> <string>ReadMe</string> <string>License</string> <string>Target</string> <string>PackageSelection</string> <string>Install</string> <string>MyFinishUp.bundle</string> </array> </dict> </plist>
把这个plist放在你分发包的Resources/[你的语言目录,比如English.lproj]下。
3. 用productbuild正确打包
如果是用productbuild生成安装包,要确保你的自定义bundle和InstallerSections.plist都被包含进去,推荐用--resources参数指定资源目录:
productbuild --distribution distribution.xml --resources ./path/to/your/resources --package-path ./packages YourAppInstaller.pkg
如果你还没有distribution.xml,可以先用productbuild --synthesize --package ./YourApp.pkg distribution.xml生成基础版本,再修改。
(可选)用distribution.xml直接配置Sections
如果觉得单独维护InstallerSections.plist麻烦,也可以直接在distribution.xml里定义页面顺序,这样更直观:
<installer-gui-script minSpecVersion="1.0"> <title>Your App Installer</title> <!-- 注册自定义section --> <section id="myFinishUp" path="./Resources/MyFinishUp.bundle"/> <!-- 指定页面顺序 --> <sections> <section id="introduction"/> <section id="readme"/> <section id="license"/> <section id="target"/> <section id="packageselection"/> <section id="install"/> <section id="myFinishUp"/> </sections> <!-- 其他配置:packages、choices等 --> <choice id="default" title="Your App"> <pkg-ref id="com.yourcompany.yourapp.pkg"/> </choice> <pkg-ref id="com.yourcompany.yourapp.pkg">YourApp.pkg</pkg-ref> </installer-gui-script>
最后验证
打包完成后,用Installer.app打开你的PKG,或者用命令行测试:
open YourAppInstaller.pkg
这时候应该只会显示你的自定义Summary页面,默认的FinishUp就不会再冒出来了。
内容来源于stack exchange

