我有一个非常奇怪的代码签名问题。之前几乎完全相同的版本已通过验证并已提交到App Store,因此我的代码签名不会被破坏。
最近我一直在尝试使用iTunesLibrary框架。此框架仅在您的应用程序经过编码时才有效。在尝试初始化指示代码签名失败的框架时,我遇到了一个常见错误:
错误域= NSPOSIXErrorDomain代码= 100001“无法加载。” UserInfo = 0x100329d80 {NSLocalizedDescription =无法加载。,NSUnderlyingError = 0x10031a430“操作无法完成。(OSStatus错误100005。)”}
我的应用程序被组织成动态链接和插件的多个框架。我一直在使用--deep
标志递归签名我的应用程序,但显然这是wrong。现在我使用run script
构建阶段来签署我的每个框架和插件。这似乎有效,codesign
告诉我该应用已签名。
我已经在调试模式下构建了应用程序并将其存档并导出为Developer ID签名程序并检查签名 - 两种构建模式都通过了。当我运行它时,我从iTunesLibrary
得到了上述错误。真正奇怪的部分是,如果我导出应用程序并自己重新签名如下,那么iTunesLibrary
正常运行:
codesign --force --sign "MyIdentity" --deep MyApp.app
如果我使用spctl --assess
尝试告诉我有关此问题的更多信息,我会了解到这个应用程序尽管工作正常但签名严重:
/Users/me/Desktop/MyApp.app: rejected
另一方面iTunesLibrary
不喜欢的应用程序通过spctl
检查:
/Users/me/Desktop/MyApp.app: accepted
source=Developer ID
origin=Developer ID Application: Me
答案 0 :(得分:0)
解决方案是将iTunesLibrary框架链接到您的主要可执行文件以及实际使用它的框架。
我很想知道为什么......
答案 1 :(得分:0)
如果要嵌入框架,则需要创建一个“复制文件”构建阶段,将您的框架移动到框架目标中。添加构建阶段后,添加运行脚本,例如:
LOCATION="${BUILT_PRODUCTS_DIR}"/"${FRAMEWORKS_FOLDER_PATH}"
IDENTITY="Developer ID Application: Certificate Common Name"
codesign --verbose --force --sign "$IDENTITY" "$LOCATION/your.framework/Versions/A"
简而言之,--deep
标志无法正常完成工作。是的,它递归地签署嵌套的bundle,但是,它将顶级bundle的参数应用于所有嵌套的bundle。反过来,您的应用程序的权利将导致生成的捆绑包无效。
间接嵌套的任何东西都需要递归应用 codesign命令。