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

时间:2016-07-22 13:21:35

标签: ios xcode swift2 xcodebuild ios-frameworks

TL;博士

将您的嵌入式框架与其他框架相关联,并且在Build& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp;在设备上运行。

描述

设定:

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

  • 使用Carthage(0.17.2)我使用required code signature missing 8.0和xcodebuild
  • 构建了 Other.framework
  • MyApp 已嵌入 My.framework
  • 应用程序和框架项目位于一个Xcode工作区下。
  • 我已将 Other.framework My.framework 联系起来(这意味着, MyApp 未链接到其他。框架(根本)。这里的要点是, MyApp 不需要使用 Other.framework API。

问题:

一切似乎都很好,直到我构建&在设备上运行应用。该应用程序已启动,并且该过程因以下Xcode错误而中止:

TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage build --platform iOS

我已经检查了 Other.framework 的签名,看起来对我来说还不错。此外,

解决方案(解决方法)

MyApp Other.framework 相关联。可怕......这感觉很糟糕。

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

注意: 有一个类似的问题iOS 8+ framework with nested embedded framework,但是,我的还有其他原因。

3 个答案:

答案 0 :(得分:2)

这个问题与嵌套框架无关。它完全与代码签名验证有关。 dyld报告说Other.framework缺少一个代码签名。您需要签署框架。这应该由Xcode为您完成,所以我很好奇Other.framework是如何构建的。

你可以通过签名来解决这个问题。

codesign --force --deep --preserve-metadata=identifier,entitlements,resource-rules,requirements,flags,team-identifier --sign - /path/to/Other.framework

或者只是深深地辞职你的应用程序:

codesign --force --deep --preserve-metadata=identifier,entitlements,resource-rules,requirements,flags,team-identifier --sign - /path/to/My.app

答案 1 :(得分:1)

Carthage github page上讨论这个问题,很清楚问题中提到的解决方法实际上是预期的行为

  

迦太基不支持嵌套框架。

     

嵌套框架不允许您重用这些框架。例如,如果A.frameworkB.framework都依赖于Other.framework,那么它们都不能嵌套Other.framework - 否则您最终可能会有2个不同版本,而正确的版本可能不会在运行时选择。

     

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

完整讨论:Linking only embedded framework with other dynamic framework fails when build & run on device: "required code signature missing"

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

Update to README: Linking dynamic frameworks to embedded frameworks requires as well linking them to the app target #1427

这在PR的范围内得到解决和结束:

#1427 README upd: link dependencies from embedded frameworks to the app target

答案 2 :(得分:1)

我按照guidance fixed修正了我的确切问题 您无需将“Other.framework”链接到MyApp。只需添加运行脚本即可签署任何需要代码签名丢失的嵌入式框架