gpt4 book ai didi

xcode - 制作准备好开发人员 ID 的 macOS 安装程序包

转载 作者:行者123 更新时间:2023-12-02 19:14:44 26 4
gpt4 key购买 nike

注意:这是针对 OS X Installer仅包,包提交给 Mac App Store遵循不同的规则。

因为山狮的Gatekeeper我终于不得不带着我的PackageMaker在谷仓后面构建脚本并拍摄它。 PackageMaker 已经从 Xcode 中移除并移到“Xcode 的辅助工具”中,所以希望它很快就会被遗忘。

问题是我如何使用 pkgbuild , productbuild , 和 pkgutil更换它?

最佳答案

我们的示例项目有两个构建目标:HelloWorld.app 和 Helper.app。我们为每个组件制作一个组件包并将它们组合成一个产品文件。
组件包包含要由 OS X 安装程序安装的负载。虽然是一个组件
包可以单独安装,它通常被合并到产品文件中。
我们的工具:pkgbuild , productbuild , 和 pkgutil
成功“构建和存档”后,在终端中打开 $BUILT_PRODUCTS_DIR。

$ cd ~/Library/Developer/Xcode/DerivedData/.../InstallationBuildProductsLocation
$ pkgbuild --analyze --root ./HelloWorld.app HelloWorldAppComponents.plist
$ pkgbuild --analyze --root ./Helper.app HelperAppComponents.plist
这给了我们component-plist,您可以在 "Component Property List"中找到值描述部分。 pkgbuild -root 生成组件包,如果您不需要更改任何默认属性,您可以省略以下命令中的 --component-plist 参数。
productbuild --synthesize 结果在 Distribution Definition .
$ pkgbuild --root ./HelloWorld.app \
--component-plist HelloWorldAppComponents.plist \
HelloWorld.pkg
$ pkgbuild --root ./Helper.app \
--component-plist HelperAppComponents.plist \
Helper.pkg
$ productbuild --synthesize \
--package HelloWorld.pkg --package Helper.pkg \
Distribution.xml
Distribution.xml您可以更改标题、背景、欢迎、自述、许可证等内容。您可以使用此命令将组件包和分发定义转换为产品文件:
$ productbuild --distribution ./Distribution.xml \
--package-path . \
./Installer.pkg
我建议看看 iTunes Installers Distribution.xml 看看有什么可能。您可以使用以下命令提取“安装 iTunes.pkg”:
$ pkgutil --expand "Install iTunes.pkg" "Install iTunes"
让我们把它放在一起
我的项目中通常有一个名为 Package 的文件夹,其中包含 Distribution.xml、component-plist、资源和脚本等内容。
添加一个名为“Generate Package”的Run Script Build Phase,安装时设置为Run script only:
VERSION=$(defaults read "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/Contents/Info" CFBundleVersion)

PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
TMP1_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp1.pkg"
TMP2_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp2"
TMP3_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp3.pkg"
ARCHIVE_FILENAME="${BUILT_PRODUCTS_DIR}/${PACKAGE_NAME}.pkg"

pkgbuild --root "${INSTALL_ROOT}" \
--component-plist "./Package/HelloWorldAppComponents.plist" \
--scripts "./Package/Scripts" \
--identifier "com.test.pkg.HelloWorld" \
--version "$VERSION" \
--install-location "/" \
"${BUILT_PRODUCTS_DIR}/HelloWorld.pkg"
pkgbuild --root "${BUILT_PRODUCTS_DIR}/Helper.app" \
--component-plist "./Package/HelperAppComponents.plist" \
--identifier "com.test.pkg.Helper" \
--version "$VERSION" \
--install-location "/" \
"${BUILT_PRODUCTS_DIR}/Helper.pkg"
productbuild --distribution "./Package/Distribution.xml" \
--package-path "${BUILT_PRODUCTS_DIR}" \
--resources "./Package/Resources" \
"${TMP1_ARCHIVE}"

pkgutil --expand "${TMP1_ARCHIVE}" "${TMP2_ARCHIVE}"

# Patches and Workarounds

pkgutil --flatten "${TMP2_ARCHIVE}" "${TMP3_ARCHIVE}"

productsign --sign "Developer ID Installer: John Doe" \
"${TMP3_ARCHIVE}" "${ARCHIVE_FILENAME}"
如果在使用 productbuild 生成包后不必更改包,则可以去掉 pkgutil --expandpkgutil --flatten脚步。您也可以在 productbuild 上使用 --sign 参数,而不是运行 productsign。
签署 OS X 安装程序
软件包使用开发人员 ID 安装程序证书签名,您可以从 Developer Certificate Utility 下载该证书。 .
他们的签名是用 --sign "Developer ID Installer: John Doe" 完成的pkgbuild、productbuild 或 productsign 的参数。
请注意,如果您要使用 productbuild 创建签名的产品存档,则没有理由对组件包进行签名。
Developer Certificate Utility
一路:将包复制到Xcode存档中
要将某些内容复制到 Xcode 存档中,我们不能使用运行脚本构建阶段。为此,我们需要使用 Scheme Action。
编辑方案并展开存档。然后单击 post-actions 并添加一个新的运行脚本操作:
在 Xcode 6 中:
#!/bin/bash

PACKAGES="${ARCHIVE_PATH}/Packages"

PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
ARCHIVE_FILENAME="$PACKAGE_NAME.pkg"
PKG="${OBJROOT}/../BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"

if [ -f "${PKG}" ]; then
mkdir "${PACKAGES}"
cp -r "${PKG}" "${PACKAGES}"
fi
在 Xcode 5 中,将此值用于 PKG反而:
PKG="${OBJROOT}/ArchiveIntermediates/${TARGET_NAME}/BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"
如果您的版本控制不存储 Xcode Scheme 信息,我建议将其作为 shell 脚本添加到您的项目中,以便您可以通过将脚本从工作区拖到后期操作中来简单地恢复操作。
脚本编写
有两种不同类型的脚本: JavaScript in Distribution Definition Files和 shell 脚本。
我在 WhiteBox - PackageMaker How-to 中找到的有关 Shell 脚本的最佳文档,但请谨慎阅读,因为它指的是旧的包格式。
苹果硅
为了让包作为 arm64 运行,分发文件必须在其 hostArchitectures 中指定它支持的部分 arm64除了 x86_64 :
<options hostArchitectures="arm64,x86_64" />
补充阅读
  • Flat Package Format - The missing documentation
  • Installer Problems and Solutions
  • Stupid tricks with pkgbuild
  • persisting obsolescence

  • 已知问题和解决方法
    目的地选择 Pane
    用户将看到目标选择选项,只有一个选择 - “为此计算机的所有用户安装”。该选项在视觉上显示为选中状态,但用户需要单击它才能继续安装,这会造成一些困惑。
    Example showing the installer bug
    Apples 文档建议使用 <domains enable_anywhere ... />但这会触发新的更多错误的目的地选择 Pane ,Apple 未在其任何包中使用该 Pane 。
    使用弃用 <options rootVolumeOnly="true" />给你旧的目的地选择 Pane 。
    Example showing old Destination Select Pane

    您想将项目安装到当前用户的主文件夹中。
    简答: 不要尝试 !
    长答案: 真的;不要尝试! 阅读 Installer Problems and Solutions .你知道我在读完这篇文章后做了什么吗?我笨到试一试。告诉自己我确信他们在 10.7 或 10.8 中解决了这些问题。
    首先,我不时看到上面提到的 Destination Select Pane Bug。那应该阻止我,但我忽略了它。如果您不想在发布软件后的一周内回复支持电子邮件,他们必须在漂亮的蓝色选项中点击一次,请不要使用它。
    您现在认为您的用户足够聪明,可以找出面板,不是吗?那么这里是关于主文件夹安装的另一件事, 他们不工作 !
    我在大约 10 台具有不同操作系统版本的不同机器上对其进行了两周的测试,并且从未失败过。所以我发货了。在发布后的一个小时内,我收到了无法安装它的用户的回复。日志暗示了您无法修复的权限问题。
    所以让我们再重复一遍:我们不使用安装程序来安装主文件夹!

    欢迎、自述、许可和结论的 RTFD 不被 productbuild 接受.
    安装程序从一开始就支持 RTFD 文件以制作带有图像的漂亮欢迎屏幕,但 productbuild 不接受它们。
    解决方法:
    使用一个虚拟的 rtf 文件并将其替换为包中的 after productbuild已经完成了。
    注意:您还可以在 RTFD 文件中包含 Retina 图像。为此使用多图像 tiff 文件: tiffutil -cat Welcome.tif Welcome_2x.tif -out FinalWelcome.tif .更多 details .

    使用 BundlePostInstallScriptPath 脚本完成安装后启动应用程序:
    #!/bin/bash

    LOGGED_IN_USER_ID=`id -u "${USER}"`

    if [ "${COMMAND_LINE_INSTALL}" = "" ]
    then
    /bin/launchctl asuser "${LOGGED_IN_USER_ID}" /usr/bin/open -g PATH_OR_BUNDLE_ID
    fi

    exit 0
    以登录用户的身份运行应用程序很重要,而不是安装程序用户。这是通过 launchctl asuser uid path 完成的。此外,我们仅在它不是命令行安装时才运行它,使用安装程序工具或 Apple 远程桌面完成。

    关于xcode - 制作准备好开发人员 ID 的 macOS 安装程序包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11487596/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com