- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于Xcode的代码签名和存档非常耗时,枯燥且有问题,因此我一直通过自己的脚本使用命令行工具xcodebuild
,codesign
等对我的开发人员ID签名的macOS应用进行代码签名,存档和交付。公证看起来将是一个巨大的痛苦。可以在我的脚本中添加公证吗?
最佳答案
是。不幸的是,official answer留下了一些松散的末端,例如this important tidbit from Quinn "the Eskimo"。这是操作方法:
一次性设置
获取特定于应用程序的密码
确定公证应用的“应用”的名称。我使用产品运输脚本的名称SSYShipProduct.pl
,因为这是将使用此密码的“应用程序”。我们将把您撰写的任何名称都称为your-notarizing-name。
浏览到https://appleid.apple.com/account/manage,滚动到“安全性”>“特定于应用程序的密码”,然后为名为your-notarizing-name的应用程序生成特定于应用程序的密码。复制它提供给您的密码。我们将其称为应用专用密码。
将特定于应用程序的密码添加到您的macOS钥匙串(keychain)
运行以下命令以将刚刚创建的密码添加到钥匙串(keychain)中:security add-generic-password -a "your-apple-ID-email" -w "app-specific-password" -s "your-notarizing-name"
-s
参数是此项目将在您的钥匙串(keychain)中使用的名称。我认为您实际上可以使用其他名称,但是在我看来,在此处也使用your-notarizing-name
是有意义的。
您可以通过在“钥匙串(keychain)访问”应用程序中搜索来验证它是否有效。但是,请注意,直到退出并重新启动后,新项目才会在“钥匙串(keychain)访问”中列出。
也许,获取相关的itc提供者
如果您的Apple ID与一个以上的Apple Developer Connection团队相关联(例如,如果您从事契约(Contract)工作),则需要该应用程序经过公证的团队的itc_provider。
要找到您团队的itc_provider,请执行以下命令:/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u "your-apple-ID-email" -p "app-specific-password"
滚动到此命令输出的输出的末尾,然后查看提供者列表。复制所需团队的简称。我们将其称为“developer-team-itc-provider”。
对于每次装运(可编写脚本!)
如果您使用/usr/bin/codesign
命令行工具对应用程序的组件进行签名,则每次对codesign的调用都必须具有以下新的parameter参数,该参数告诉codesign使用所谓的强化运行时进行签名:
`--options runtime`
.zip
或
.dmg
。例如:your-pbid-value =
com.mycompany.YourApp.zip
。
altool
,这是Apple的Application Loader Tool的名称。
/usr/bin/xcrun altool --notarize-app --primary-bundle-id "your-pbid-value" --username "your-apple-id-email" --password "@keychain:your-notarizing-name" -itc_provider "developer-team-itc-provider" --file /path/to/YourApp.zip/or/YourApp.dmg --output-format "xml"
-itc_provider
仅以一个破折号开头。此外,如果您使用的脚本语言在字符串中内插
@
字符,请对其进行编码以防止对
@keychain
进行内插)。
xcrun
将退出并打印到标准输出一些XML,如果您的提交被接受(注意:尚未批准),它将类似于以下示例:
<?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>notarization-upload</key>
<dict>
<key>RequestUUID</key>
<string>2ab59b26-19ec-4a30-84cf-6d2cb8d3c97e</string>
</dict>
<key>os-version</key>
<string>10.15.0</string>
<key>success-message</key>
<string>No errors uploading 'path/to/YourApp.zip'.</string>
<key>tool-path</key>
<string>/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework</string>
<key>tool-version</key>
<string>1.1.1138</string>
</dict>
</plist>
RequestUUID
值。但是,由于我经常发布四个应用程序,并且由于我的发布脚本失败而又没有提供有用的错误信息,这毁了我的一天,并且由于(请参见下文)您将要进行另一个调用并返回有趣的XML,因此我花了一些时间在我的脚本中添加了一个子例程,该子例程带有两个参数,即XML和一个密钥路径,并在给定的密钥路径下返回XML的值。在上述情况下,我调用此子例程以获取
RequestUUID
,然后再次获取
success-message
。
PlistBuddy
。这有点痛苦,因为不幸的是,
altool
无法选择将其输出写入文件,而
PlistBuddy
未记录为接受stdin。因此,我的子例程将odt_code中的stdout写入临时文件,然后将该临时文件的路径传递给PlistBuddy。有点令人作呕,但可以。)
altool
或
.zip
文件。原因:该文件是从尚未装订公证单的产品中存档的。在脚本的最后,您将从具有票证的修改后的应用程序中创建一个新的
.dmg
或
.zip
。立即删除文件可防止您错误地运输未装订的应用程序。
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>notarization-info</key>
<dict>
<key>Date</key>
<date>2019-08-07T01:17:37Z</date>
<key>RequestUUID</key>
<string>4ba71353-9d99-4b52-b579-37f384717130</string>
<key>Status</key>
<string>in progress</string>
</dict>
<key>os-version</key>
<string>10.15.0</string>
<key>success-message</key>
<string>No errors getting notarization info.</string>
<key>tool-path</key>
<string>/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework</string>
<key>tool-version</key>
<string>1.1.1138</string>
</dict>
</plist>
.dmg
,其值
notarization-info:Status
表示Apple仍在处理您的提交。通常在几分钟后(Apple说“应该少于一个小时”,但是我在2019年7月4日美国假日下午经历了长达三个半小时的时间),
in progress
将以不同的方式返回到您的脚本xml在stdout中,如下所示:
<?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>notarization-info</key>
<dict>
<key>Date</key>
<date>2019-08-06T23:28:25Z</date>
<key>LogFileURL</key>
<string>https://osxapps-ssl.itunes.apple.com/itunes-assets/Enigma113/v4/f6/09/be/f609bee3-b031-323a-0987-d1f620a78758/developer_log.json?accessKey=1565410613_1722173034418364591_TvycjBAzd6FRTYGKZEFU6EwDfsws8Wa1MV%2FYnTiJ1zyOZamc%2FoeO5RMeIzZN669ZQJgO2Q4W48ipKNFO%2BQGuq%2FITXN8MQAetbNe90w9ogzqXbrzTHg%2FgYK89yvEFmiiRxhaVlZqLI93NBpY0hwBqXv2bvvlg%2FRCc%2BVaCNRJ%2BrnE%3D</string>
<key>RequestUUID</key>
<string>07fc3745-b0ff-4d1a-9b15-37f384717130</string>
<key>Status</key>
<string>success</string>
<key>Status Code</key>
<integer>0</integer>
<key>Status Message</key>
<string>Package Approved</string>
</dict>
<key>os-version</key>
<string>10.15.0</string>
<key>success-message</key>
<string>No errors getting notarization info.</string>
<key>tool-path</key>
<string>/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework</string>
<key>tool-version</key>
<string>1.1.1138</string>
</dict>
</plist>
altool
的值不是
Status
,或者如果愿意,则在定义
in progress
时,脚本应该解析XML并退出循环。或者,如果您更喜欢电子邮件触发器,则脚本可以查找主题行来自Apple的电子邮件。现在,您可以分发Mac软件。
LogFileURL
命令将在1-5小时内失败,返回非零退出代码,并且在stdout中显示错误代码1519“找不到RequestUUID”,如以下示例stdout中所示:
<?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>os-version</key>
<string>10.15.1</string>
<key>product-errors</key>
<array>
<dict>
<key>code</key>
<integer>1519</integer>
<key>message</key>
<string>Could not find the RequestUUID.</string>
<key>userInfo</key>
<dict>
<key>NSLocalizedDescription</key>
<string>Could not find the RequestUUID.</string>
<key>NSLocalizedFailureReason</key>
<string>Apple Services operation failed.</string>
<key>NSLocalizedRecoverySuggestion</key>
<string>Could not find the RequestUUID.</string>
</dict>
</dict>
</array>
<key>tool-path</key>
<string>/Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/Frameworks/AppStoreService.framework</string>
<key>tool-version</key>
<string>4.00.1181</string>
</dict>
</plist>
altool --notarization-info
,并继续使用后续命令返回
Success
,我从Apple收到了成功电子邮件。今天发生的延迟有7个不同的良好Request UUID,最长为5小时。可能在这时,Apple Notary Service创建和向您发送请求UUID之间存在1-5小时的延迟,并且该延迟出现在数据库中,Apple Notary Service用于响应
Success
请求,因此您会收到此错误消息。很伤心
notarization-info
的
code
时死亡数组条目不是1519。如果您使用PlistBuddy照原样解析XML,则其关键路径是code应当是
product-errors
。每当收到错误1519时,脚本中的循环都会打印,因此我可以看到发生了什么,当然,我修改了它的
product-errors:0:code
条件,以使错误代码为1519时不退出。
while
查询。响应是错误的错误1519。后续查询也返回错误的错误1519,持续了将近3个小时,直到12:44。然后,在12:45,它突然收到了
altool --notarization-info
响应。经过5次
in progress
响应后,终于在12:47成功。
in progress
,然后几分钟后返回成功。结论:绕开到错误1519困惑中的请求UUID不会与以后的请求UUID一起排队在FIFO中,后者可能会避免错误1519绕道。因此,更好的解决方法可能是在收到另一个错误1519响应后放弃请求UUID,然后通过将应用程序重新上载到Apple Notary Service重新开始,并获取另一个您希望更好的请求UUID。当然,在接下来的几个小时内,您将收到许多电子邮件,因为您放弃的所有请求UUID最终都会成功。
in progress
的值,以便可以检查日志,因为即使公证成功,Apple创建的日志文件也可能包含警告。要获取日志文件,您的脚本当然应该
curl <LogFileURL-Value>
LogFileURL
的值。因此,您的脚本应使用JSON解析器解析该
issues
输出,并且如果键
curl
的值是JSON空值或空数组,请继续发货。
xcrun stapler staple /path/to/YourApp.app
issues
。这显然是您的公证单。请注意,此文件是
YourApp.app/Contents/CodeResources
文件的补充,后者仍然存在,并且包含代码签名,与公证前的日期相同。
spctl -a -v /path/to/YourApp.app
/path/to/YourApp.app: accepted
source=Notarized Developer ID
关于macos - macOS:在脚本中公证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56890749/
在跨平台应用程序中,我正在使用一个配置文件,允许用户根据需要覆盖各种默认值。 我的问题是...在哪里放置/查找此配置文件,尤其是关于 MacOS X(我从未使用过且无法访问)?我知道 MacOS X
由于Xcode的代码签名和存档非常耗时,枯燥且有问题,因此我一直通过自己的脚本使用命令行工具xcodebuild,codesign等对我的开发人员ID签名的macOS应用进行代码签名,存档和交付。公证
我正在寻找一种在 MacOs 应用程序中以编程方式逐帧绘制动画的方法(不是关键帧属性动画)。我尝试使用drawLayer:inContext:委托(delegate)方法绘制到CALayers,调用s
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我在83%的安装openCV中遇到问题...我的python是2.7.3。我已经适应了xcode。我使用了这个tuturial。 我的Cmake: cmake -D CMAKE_BUILD_TYPE=
我需要弄清楚 Mac 的日志键的键码(ctrl、shift 等)或者需要知道如何跟踪这个日志按键事件... 基本上我正在将 mac key 代码转换为等效的 Windows key 代码......我
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
我想将一个 Rust 程序从我的 x86 Mac 交叉编译成一个可以在 Silicon Mac 上运行的二进制文件,但我无法弄清楚链接。 我有: 运行 macOS 10.15.7 Catalina 的
在 macOS ventura 中,我无法复制我的终端应用程序。 我想这样做,因为我有一个 M1 处理器,我想要一个使用 Rosetta2 打开的处理器和一个本地打开的处理器。 有什么办法解决这个问题
当您可以访问实际硬件时,在 Mac 上以安全模式启动是很容易的。您只需在启动时按住 shift 键即可。 在虚拟机中运行 macOS (OSX) 时如何启动到安全模式? 最佳答案 Schmitty 在
这个问题在这里已经有了答案: How to get Conda and Virtualenv to work on mac OS Catalina? (8 个答案) 关闭 3 年前。 我在 macO
我有一个关于 macOS 应用程序图标的问题。我以前看过很多动画图标,但从来没有真正密切关注正在发生的事情/他们是如何做的。我只是想知道是否有任何方法可以创建在停靠栏中动画的动画应用程序图标。 例如:
每当我在 vim 中输入终端命令(例如,!echo hello)时,我会立即被踢出去查看该终端命令的结果,然后提示我使用 按 ENTER 或键入命令继续。这有点刺耳。我想留在 vim 中,并在底部打印
当使用文本编辑应用程序时,选择一种字体(例如“Menlo”)来呈现字形,当所选字体不包含特殊字形(例如“𠹷”,它是一个简单的中文字形,“Menlo"不包含它), 应用程序会选择一种字体来呈现它, 在
已经有几个关于如何在 Mac 上启用虚拟化的问题(例如 How to enable support of CPU virtualization on Macbook Pro?)。经常报告 sysctl
这只是出于好奇。 Exposé 有两个功能,其中一个是重新排列桌面上的窗口,一个是显示所有打开的窗口,这样用户可以看到隐藏在其他窗口下面的窗口,另一个功能是将所有窗口移到两侧,让用户与桌面交互。 我只
我使用的是 MacOS X,我对应用程序包类型的东西还很陌生。我正在编写一个程序来打开一个窗口并注册鼠标输入——而不是一个命令行工具。当我将我的代码(用 C 编写,如果这很重要)编译成一个可执行文件(
我正在制作一个必须支持 macOS 的 Flutter 插件。但是,当我想创建一个插件并在示例应用程序中运行该插件时(即使我还没有编辑过 Flutter 生成的代码),Xcode 会抛出以下错误。 无
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我想在终端(MacOs)中像屏幕一样显示当前目录面包屑: 我该怎么做? 现在它只是一个文本...... 谢谢 最佳答案 首选项 -> 窗口 -> 检查工作目录或文档下的“路径”。 路径将作为窗口标题的
我是一名优秀的程序员,十分优秀!