安装

时间:2016-04-19 04:16:07

标签: macos qt productbuild

我有一个用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

在产品构建之后,重定位说/ Applications,但它没有在那里安装!!在随后的运行中,它会说错误的路径。我也试过从不同的地方安装。

我也尝试过从Mac Store安装应用程序,它也会这样做......它会进入错误的路径。

我用过:

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是在做一些奇怪的事吗?

2 个答案:

答案 0 :(得分:1)

最后我想我有一个解释。

除了我们的构建机器之外,它在每台其他机器上正确安装。原因似乎是在从文件系统的任何地方执行命名的MyApp.app之后,osx会记住该路径。因此,当您下次尝试安装它时(更新?),它将在已知路径上更新应用程序。

更奇怪的情况是,当您有两个“安装”应用程序(两个副本)并且您尝试再次安装它时,它将在两个实例之间交替安装它!闻起来像一个臭虫,苹果永远不会解决。

感谢@ l'L'l的帮助。如果你能解释一下这种行为,那将是一个加分。

答案 1 :(得分:0)

我也碰到了这个,我找到解决问题的唯一方法就是在这个过程中使用组件plist文件(pkgbuild)使用中间components.plist步骤。

下面的命令假定一个名为 Applications 的目录,其中包含当前目录中存在的构建产品(应用程序)以及文件components.plist。它将结果写入ApplicationPackage.pkg

$ > pkgbuild --root ./Applications --component-plist ./components.plist --identifier "com.company.app.pkg" --install-location /Application ApplicationPackage.pkg

然后是productbuild步骤。

键实际上是BundleIsRelocatable - components.plist中的键,其值为false

<?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>