在设备上构建 & 运行 时,仅将嵌入式框架与其他动态框架链接失败
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):
- 使用 Carthage (0.17.2) 我构建了 Other.framework
xcodebuild
8.0 和 TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage build --platform iOS
- MyApp 已嵌入 My.framework.
- 应用程序和框架项目在一个 Xcode 工作区下。
- 我只link编辑Other.framework到My.framework(也就是说,MyApp 根本没有 link 编辑到 Other.framework)。这里的重点是,MyApp不需要使用Other.frameworkAPI.
问题:
一切似乎都运行良好,直到我在设备上构建并运行应用程序。该应用程序已启动,但该过程因以下 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 MyApp 与 Other.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.
README 中并不清楚,所以我提出了另一个问题,要求更新文档:
这已在 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。只需添加 运行 脚本来签署任何需要代码签名的嵌入框架
tl;博士
Link将您的嵌入式框架与其他框架结合使用,而不要 link 将其他框架与您的应用程序结合使用,因为 required code signature missing
在设备上构建和 运行。
描述:
设置:
我的设置非常简单(Swift 2.3 & Xcode Xcode 8.0;构建版本 8S162m):
- 使用 Carthage (0.17.2) 我构建了 Other.framework
xcodebuild
8.0 和TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage build --platform iOS
- MyApp 已嵌入 My.framework.
- 应用程序和框架项目在一个 Xcode 工作区下。
- 我只link编辑Other.framework到My.framework(也就是说,MyApp 根本没有 link 编辑到 Other.framework)。这里的重点是,MyApp不需要使用Other.frameworkAPI.
问题:
一切似乎都运行良好,直到我在设备上构建并运行应用程序。该应用程序已启动,但该过程因以下 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 MyApp 与 Other.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
andB.framework
both depend onOther.framework
, then neither of them can nestOther.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.
README 中并不清楚,所以我提出了另一个问题,要求更新文档:
这已在 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。只需添加 运行 脚本来签署任何需要代码签名的嵌入框架