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

Linking only embedded framework with other dynamic framework fails when build & run on device

tl;博士

Link将您的嵌入式框架与其他框架结合使用,而不要 link 将其他框架与您的应用程序结合使用,因为 required code signature missing 在设备上构建和 运行。

描述:

设置:

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

问题:

一切似乎都运行良好,直到我在设备上构建并运行应用程序。该应用程序已启动,但该过程因以下 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'  

我检查了 Other.framework 的签名,我觉得没问题。而且,

解决方案(解决方法)

Link MyAppOther.framework。糟透了。。。感觉很崩溃。

Link将完全相同的二进制文件 Other.framework 转换为 MyApp 并以这种方式解决问题,要点out,Other.framework 构建正常并且能够正确重新签名。可能与迦太基无关。

注意: 有一个类似的问题iOS 8+ framework with nested embedded framework,不过我的原因略有不同

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

Carthage doesn't support nested frameworks.

Nesting frameworks doesn't let you reuse those frameworks. For instance, if A.framework and B.framework both depend on Other.framework, then neither of them can nest Other.framework—otherwise you might end up with 2 different versions, and the correct one might not be chosen at runtime.

The correct way to do this is to list it as a dependency, but link it into the app target.

完整讨论: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

问题与嵌套框架无关。它完全是关于代码签名验证。 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

我按照这个 guidance
解决了我的确切问题 您不需要 link 您的 'Other.framework' 到您的 MyApp。只需添加 运行 脚本来签署任何需要代码签名的嵌入框架