我有一个用Qt构建的OSX应用程序。它经过代码签名,包装适合macstore,并已获得苹果公司的批准,准备在mac商店出售。
尽管在安装后,它会安装到打包过程中它所在的位置,而不是/Applications。
或者,我正在创建该文件的.dmg包,可以将其安装到/Applications中。
在构建过程的最后,我运行以下命令:
codesign --force --deep --verify MyApp.app/ --entitlements ${INSTDIR}/Entitlements.plist -s "3rd Party Mac Developer Application: Company Name"
productbuild --component MyApp.app /Applications --sign "3rd Party Mac Developer Installer: Company Name" MyApp.pkg
结果就是pkg,我正试图通过安装程序安装它:
$ sudo installer -store -pkg MyApp.pkg -target /
installer: Note: running installer as an admin user (instead of root) gives better Mac App Store fidelity
installer: MyApp.pkg has valid signature for submission: 3rd Party Mac Developer Installer: Company Name (key)
installer: Installation Check: Passed
installer: Volume Check: Passed
installer: Bundle com.CompanyName.MyApp will be relocated to /Users/peti/dev/build/bin/Mac/release/MyApp.app
installer: Starting install
installer: Install 0.0% complete
installer: Install 17.1% complete
installer: Install 96.4% complete
installer: Install 100.0% complete
installer: Finished install
就在productbuild之后,重新定位说/Applications,但它没有在那里安装它!!在随后的运行中,它会显示错误的路径。我也试过从不同的位置安装。
我还试着从Mac商店安装了这个应用程序,它也能起到同样的作用。。。它进入了错误的路径。
我使用过:
pkgutil --expand
提取包裹。PackageInfo文件显示:
<pkg-info overwrite-permissions="true" relocatable="false" identifier="com.CompanyName.MyApp" postinstall-action="none" version="3.0.0" format-version="2" generator-version="InstallCmds-502 (14F1605)" install-location="/Applications" auth="root" preserve-xattr="true">
有什么问题吗?我试过在谷歌上搜索解决方案,但没有成功。这个错误的路径可以存储在哪里?在productbuild之前,我没有看到任何文件中嵌入的路径。productbuild是在做一些奇怪的事情吗?
最后我想我有了一个解释。
除了我们的构建机器,它在其他所有机器上都能正确安装。原因似乎是,在您从文件系统上的任何位置执行名为MyApp.app的程序后,osx都会记住该路径。因此,当你下次尝试安装它时(更新?),它会在已知路径上更新应用程序。
更奇怪的情况是,当你有两个应用程序的"安装"(两个副本),并且你试图再次安装它时,它会在两个实例之间交替安装!闻起来像个bug,苹果永远不会修复。
感谢@l'l'l的帮助。如果你能向我解释这种行为,那将是一个加分项。
我也遇到过这种情况,我找到的唯一解决方法是在过程中使用组件plist文件(components.plist
)使用中间pkgbuild
步骤。
下面的命令包含一个名为Applications的目录,其中包含要在当前目录中出现的已构建产品(应用程序)以及文件components.plist
。它将结果写入ApplicationPackage.pkg
。
$ > pkgbuild --root ./Applications --component-plist ./components.plist --identifier "com.company.app.pkg" --install-location /Application ApplicationPackage.pkg
接下来是产品构建步骤。
密钥实际上是值为false
的components.plist
中的BundleIsRelocatable
-密钥。
<?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">
<array>
<dict>
<key>BundleHasStrictIdentifier</key>
<true/>
<key>BundleIsRelocatable</key>
<false/>
<key>BundleIsVersionChecked</key>
<true/>
<key>BundleOverwriteAction</key>
<string>upgrade</string>
<key>RootRelativeBundlePath</key>
<string>AppBundle.app</string>
</dict>
</array>
</plist>