【问题标题】:Codesigning OS X app with plugins and iTunesLibrary使用插件和 iTunesLibrary 共同设计 OS X 应用程序
【发布时间】:2014-04-02 03:00:09
【问题描述】:

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

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

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

我的应用被组织成多个框架,包括动态链接和插件。我一直在使用--deep 标志对我的应用程序进行递归签名,但显然这是wrong。现在我使用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

【问题讨论】:

    标签: macos xcode5 osx-mavericks codesign ituneslibrary


    【解决方案1】:

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

    我很想知道为什么...

    【讨论】:

      【解决方案2】:

      如果您要嵌入框架,则需要创建一个“复制文件”构建阶段,将您的.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 codesign --deep 还指出:

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

      【讨论】:

      • 是的,一切都已完成。问题是 iTunesLibrary 的代码签名检查似乎要求框架链接到主可执行文件而不是动态库或插件。
      猜你喜欢
      • 2017-07-25
      • 1970-01-01
      • 2013-05-11
      • 2011-12-08
      • 1970-01-01
      • 2014-06-16
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多