macOS 10.14.5 --> 抱歉,我的 Catalina 在工作中处于隔离状态! Xcode 11.2.1
com.apple.security.cs.disable-library-validation 的行为与文档不符。
我的测试应用程序基于 X11 (XQuartz),因此需要/opt/X11/和/usr/lib/中的库,它们的团队 ID 与我的不同。
该应用程序包含一个 C 二进制文件,其工作方式称为“winteracter”,这是一个显示 X11 窗口和对话的小型 FORTRAN 二进制文件。 “winteracter”在导入到 Xcode 之前已被签名/强化/沙盒化(继承)。它被放置在 Resources 文件夹中,但放置在 MacOS 中没有区别。
权利如下: 主要应用:
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.temporary-exception.files.absolute-path.read-only</key>
<array>
<string>/opt/X11/lib/</string>
<string>/usr/lib/</string>
</array>
辅助二进制文件:
<key>com.apple.security.inherit</key>
<true/>
应用程序成功公证(因此签名、强化和沙箱都可以) 高塞拉:有效。 Mojave:它给出运行时错误(控制台:error+fault+winteracter):
Library Validation failed: Rejecting '/opt/X11/lib/libXt.6.dylib' (Team ID: NA574AWV7E, platform: no) for process 'winteracter(11592)' (Team ID: P65398CN49, platform: no), reason: mapping process and mapped file (non-platform) **have different Team IDs**
这很奇怪,原因有二: 1-拒绝不同的团队ID与Apple对“disable-library-validation”的描述相矛盾 2019 年 12 月 2 日,我通过简单地使用带有“-o runtime”的命令行协同设计获得了一个功能性的公证应用程序。这不再有效。
有什么建议吗?
最佳答案
这里是我的解决方案的更详细描述。
我终于找到了一个解决方案来获得功能齐全的经过公证的应用程序。 该 bundle 的组织方式如下:
TestApp.app
Contents
MacOS
testAppp <-- a launcher (C binary)
myAlert <-- an alert dialogue (Cocoa binary)
Resources
winteracter <-- an X11 (Xquartz) window and dialogue (Fortran binary)
二进制文件“winteracter”基于Winteracter 库<http://www.winteracter.com > 使用 OpenMotif 和 Xquartz
winteracter 二进制文件
此二进制文件先于其他二进制文件手动强化(即从 Xcode 外部):
codesign -d --force --options runtime --verbose=4 -s "$DEV_CERTIFICATE" --entitlements "winteracter.entitlements" "winteracter"
winteracter.entitlements 应仅包含以下键:
<key>com.apple.security.cs.disable-library-validation</key>
<true>
testApp 和 myAlert 二进制文件
这些是手动签名和强化的:
codesign -d --force --options runtime --verbose=4 -s "$DEV_CERTIFICATE" "$MYBINARY"
或使用 Xcode:
In that case be sure to manually erase the field "*Code Signing Entitlements*" in Build Settings.
即使您从功能界面中删除“沙盒”,它也可能会保持填充状态。
经过公证后,该应用程序即可正常运行。 我尝试对其进行沙箱处理,但臭名昭著的错误“映射进程和映射文件(非平台)具有不同的团队 ID”又出现了!
但是我的错误是什么?
1- Apple 表示,沙箱 key 只能在主二进制文件的权利文件中出现一次,其他 key 仅具有“继承” key 。我错误地认为 com.apple.security.cs.disable-library-validation 也被继承了。
2-我认为 com.apple.security.app-sandbox key 在权利文件中是强制性的。一点也不!
3-我错误地认为将 com.apple.security.app-sandbox 设置为 false 相当于没有授权文件。又错了!
4-我错误地认为 Xcode 界面“签名和功能”正确管理build设置。
5-我执行了太多的尝试错误,以至于我不记得我迷路的所有死胡同。
关于libraries - 映射进程和映射文件具有不同的团队 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61449772/