公证和装订包含 .app 的 .zip 的最有效方法是什么?
What is the most efficient way to notarize and staple a .zip containing a .app?
目前无法提交.app/
文件夹进行公证,必须先打包。另一方面,票据在公证成功后不能装订到.zip
。 Apple Documentation
这将创建如下流程:
- 构建应用程序
- 压缩
.app/
- 提交
.zip
公证
- 解压
.zip
- 将门票装订到
.app/
- 重新压缩
.app/
以便分发
我们的具体用例是,我们的应用程序最初将由用户从 .dmg
安装,而后续更新将通过 .zip
下载。公证 .dmg
非常简单。压缩内容是另一回事。
是否有比上述步骤更有效的方法?
不,丹,你明白了。您的用例与我的相似,我就是这样做的。在我的例子中,我分发了一个 .pkg,它包含一个应用程序、一个卸载程序、几个内核扩展,但对于一个应用程序来说,概念是相同的。顺便说一下,就像你的 dmg,我分发 pkg 用于下载,然后压缩 pkg 用于 Sparkle 更新。
除非您将 zip 文件视为打包和提交应用程序包的一种方式,否则这个过程只会显得很奇怪。您想要对应用进行公证并将生成的公证装订到应用程序包中。你这样做:
- 通过提交应用程序包的压缩包对应用程序进行公证。
- 公证成功完成后,将结果装订到应用程序包中。
- 打包应用程序包以进行分发(在您的情况下,将其添加到 dmg)。
- 公证dmg,并装订到dmg。
为了更方便:如果您在 makefile 中执行此操作,make 可以在装订之前自动等待公证。我这样做:
notarizationRequestID=$(shell xcrun altool --notarize-app \
--primary-bundle-id com.mycompany.appID \
--username $(DEV_USERNAME)
--password $(DEV_PASSWORD)
--asc-provider $(DEV_PROVIDER) \
--file myApp.app.zip \
| awk '/RequestUUID/ { print $$NF; }') ;\
while ! xcrun altool --notarization-info $$notarizationRequestID \
--username $(DEV_USERNAME)
--password $(DEV_PASSWORD)
--asc-provider $(DEV_PROVIDER) \
--output-format xml \
| grep -q 'https://osxapps-ssl.itunes.apple.com/itunes-assets' ;\
do sleep 5 ;\
echo "." ;\
done ;\
如果您通过 Sparkle 分发更新,您还需要收集应用投射元数据,以便将其粘贴到您的应用中 cast.xml。在 makefile 的末尾:
@echo "——————————————————————————————————"
@echo " Results for Sparkle Update XML "
@echo "——————————————————————————————————"
@echo
@echo "version: " `defaults read myApp.app/Contents/Info CFBundleVersion`
@echo "shortVersionString:" `defaults read myApp.app/Contents/Info CFBundleShortVersionString`
@echo "dsaSignature: " `$MyAppSource/Libraries/Sparkle/bin/sign_update myAppInstaller.pkg.zip $MyAppSource/Resources/UpdateSigningKeys/dsa_priv.pem`
@echo "length: " `stat -f%z "myApp.pkg`
目前无法提交.app/
文件夹进行公证,必须先打包。另一方面,票据在公证成功后不能装订到.zip
。 Apple Documentation
这将创建如下流程:
- 构建应用程序
- 压缩
.app/
- 提交
.zip
公证 - 解压
.zip
- 将门票装订到
.app/
- 重新压缩
.app/
以便分发
我们的具体用例是,我们的应用程序最初将由用户从 .dmg
安装,而后续更新将通过 .zip
下载。公证 .dmg
非常简单。压缩内容是另一回事。
是否有比上述步骤更有效的方法?
不,丹,你明白了。您的用例与我的相似,我就是这样做的。在我的例子中,我分发了一个 .pkg,它包含一个应用程序、一个卸载程序、几个内核扩展,但对于一个应用程序来说,概念是相同的。顺便说一下,就像你的 dmg,我分发 pkg 用于下载,然后压缩 pkg 用于 Sparkle 更新。
除非您将 zip 文件视为打包和提交应用程序包的一种方式,否则这个过程只会显得很奇怪。您想要对应用进行公证并将生成的公证装订到应用程序包中。你这样做:
- 通过提交应用程序包的压缩包对应用程序进行公证。
- 公证成功完成后,将结果装订到应用程序包中。
- 打包应用程序包以进行分发(在您的情况下,将其添加到 dmg)。
- 公证dmg,并装订到dmg。
为了更方便:如果您在 makefile 中执行此操作,make 可以在装订之前自动等待公证。我这样做:
notarizationRequestID=$(shell xcrun altool --notarize-app \
--primary-bundle-id com.mycompany.appID \
--username $(DEV_USERNAME)
--password $(DEV_PASSWORD)
--asc-provider $(DEV_PROVIDER) \
--file myApp.app.zip \
| awk '/RequestUUID/ { print $$NF; }') ;\
while ! xcrun altool --notarization-info $$notarizationRequestID \
--username $(DEV_USERNAME)
--password $(DEV_PASSWORD)
--asc-provider $(DEV_PROVIDER) \
--output-format xml \
| grep -q 'https://osxapps-ssl.itunes.apple.com/itunes-assets' ;\
do sleep 5 ;\
echo "." ;\
done ;\
如果您通过 Sparkle 分发更新,您还需要收集应用投射元数据,以便将其粘贴到您的应用中 cast.xml。在 makefile 的末尾:
@echo "——————————————————————————————————"
@echo " Results for Sparkle Update XML "
@echo "——————————————————————————————————"
@echo
@echo "version: " `defaults read myApp.app/Contents/Info CFBundleVersion`
@echo "shortVersionString:" `defaults read myApp.app/Contents/Info CFBundleShortVersionString`
@echo "dsaSignature: " `$MyAppSource/Libraries/Sparkle/bin/sign_update myAppInstaller.pkg.zip $MyAppSource/Resources/UpdateSigningKeys/dsa_priv.pem`
@echo "length: " `stat -f%z "myApp.pkg`