在设备上构建和运行时,仅将嵌入式框架与其他动态框架链接失败

Yev*_*nin 7 xcode xcodebuild ios ios-frameworks swift2

TL;博士

将嵌入式框架与其他框架链接,并且required code signature missing在设备上构建和运行时不要将其他框架与您的应用程序相关联.

描述:

建立:

我的设置非常简单(Swift 2.3和Xcode Xcode 8.0; Build版本8S162m):

  • 使用Carthage(0.17.2)我用8.0和更高版本构建了Other.frameworkxcodebuildTOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage build --platform iOS
  • MyApp嵌入了My.framework.
  • 应用程序和框架项目位于一个Xcode工作区下.
  • 只是Other.framework链接到My.framework(这意味着,MyApp根本没有链接到Other.framework).这里的要点是,MyApp不需要使用Other.framework API.

问题:

一切似乎工作正常,直到我在设备上构建和运行应用程序.该应用程序已启动,并且该过程因以下Xcode错误而中止:

dyld: Library not loaded: @rpath/Other.framework/Other  
  Referenced from: /private/var/containers/Bundle/Application/DCF0331F-FF23-43CF-AE79-B3857D5A6EE3/MyApp.app/Frameworks/My.framework/My  
  Reason: no suitable image found.  Did find:  
  /private/var/containers/Bundle/Application/DCF0331F-FF23-43CF-AE79-B3857D5A6EE3/MyApp.app/Frameworks/My.framework/Frameworks/Other.framework/Other: required code signature missing for '/private/var/containers/Bundle/Application/DCF0331F-FF23-43CF-AE79-B3857D5A6EE3/MyApp.app/Frameworks/My.framework/Frameworks/Other.framework/Other'  
Run Code Online (Sandbox Code Playgroud)

我检查了Other.framework的签名,看起来对我来说很好.此外,

解决方案(解决方法)

MyAppOther.framework链接.可怕......这感觉很糟糕.

将完全相同的二进制Other.framework链接到MyApp并以这种方式解决问题,指出,Other.framework构建正常并且能够正确地重新签名.可能与迦太基没什么关系.

注意:iOS 8+框架与嵌套嵌入式框架 存在类似问题,但是,我的还有其他原因.

Yev*_*nin 1

在Carthage github 页面上讨论这个问题,很明显问题中提到的解决方法实际上是预期的行为

\n\n
\n

Carthage 不支持嵌套框架。

\n\n

嵌套框架不允许您重用这些框架。例如,如果A.frameworkB.framework都依赖于Other.framework,那么它们都不能嵌套Other.framework\xe2\x80\x94 否则你可能最终会得到 2 个不同的版本,并且在运行时可能无法选择正确的版本。

\n\n

正确的方法是将其列为依赖项,但将其链接到应用程序目标。

\n
\n\n

完整讨论:在设备上构建和运行时仅将嵌入式框架与其他动态框架链接失败:“缺少所需的代码签名”

\n\n

README 中并不清楚这一点,因此我提出了另一个问题,要求更新文档:

\n\n

更新自述文件:将动态框架链接到嵌入式框架还需要将它们链接到应用程序目标 #1427

\n\n

此问题已在 PR 范围内解决并关闭:

\n\n

#1427 自述文件更新:将嵌入式框架的依赖项链接到应用程序目标

\n