0

我有一个非常奇怪的代码设计问题。以前几乎相同的版本已通过验证并已提交到 App Store,因此我的代码签名没有损坏。

最近我一直在尝试使用iTunesLibrary框架。此框架仅在您的应用程序经过代码签名时才有效。尝试初始化表明代码设计失败的框架时,我遇到了一个常见错误:

错误域 = NSPOSIXErrorDomain 代码 = 100001 “无法加载。” UserInfo=0x100329d80 {NSLocalizedDescription=无法加载。,NSUnderlyingError=0x10031a430“操作无法完成。(OSStatus 错误 100005。)”}

我的应用程序被组织成多个框架,包括动态链接和插件。我一直在使用该--deep标志对我的应用程序进行递归签名,但显然这是错误的。现在我正在使用run script构建阶段来签署我的每个框架和插件。这似乎codesign告诉我应用程序已签名。

我已经在调试模式下构建了应用程序,并将其存档并导出为开发人员 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
4

2 回答 2

0

解决方案是将 iTunesLibrary 框架链接到您的主要可执行文件以及实际使用它的框架。

我很想知道为什么...

于 2014-02-28T22:27:17.400 回答
0

如果要嵌入框架,则需要创建一个“复制文件”构建阶段,将 your.framework 移动到框架目标中。在添加构建阶段之后,添加一个运行脚本,例如:

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旗帜无法正常工作。是的,它递归地对嵌套包进行签名,但是,它将顶级包的参数应用于所有嵌套包。反过来,您应用的权利将导致生成的捆绑包无效。

man codedesign --deep 还指出:

; 任何间接嵌套的东西都需要递归应用 codesign 命令。

于 2014-03-01T03:11:41.383 回答