使用插件和iTunesLibrary对OS X应用进行协同设置

时间:2014-02-28 21:51:58

标签: macos xcode5 osx-mavericks codesign ituneslibrary

我有一个非常奇怪的代码签名问题。之前几乎完全相同的版本已通过验证并已提交到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

2 个答案:

答案 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。反过来,您的应用程序的权利将导致生成的捆绑包无效。

man codesign --deep还声明:

  

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