签名嵌入式框架在 Xcode 11.2.1 中不起作用

Signing embedded framework not working in Xcode 11.2.1

我有一个小型概念验证应用程序,我试图在我的框架 (AequumPOCFramework.framework) 中嵌入(并签名)一个框架 (Alamofire),但是,当我尝试部署时在我的设备上,它一直给我错误

....not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.

如果我只是尝试部署自己的框架,而没有嵌入 Alamofire,一切正常。

部署到我的 iphone 时的完整错误是:

dyld: Library not loaded: @rpath/Alamofire.framework/Alamofire Referenced from: /private/var/containers/Bundle/Application/EDB697EB-EA15-4301-B4B6-A8FE1F0212BE/PocIOS.app/Frameworks/AequumPOCFramework.framework/AequumPOCFramework Reason: no suitable image found. Did find: /private/var/containers/Bundle/Application/EDB697EB-EA15-4301-B4B6-A8FE1F0212BE/PocIOS.app/Frameworks/AequumPOCFramework.framework/Frameworks/Alamofire.framework/Alamofire: code signature in (/private/var/containers/Bundle/Application/EDB697EB-EA15-4301-B4B6-A8FE1F0212BE/PocIOS.app/Frameworks/AequumPOCFramework.framework/Frameworks/Alamofire.framework/Alamofire) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.

我做错了什么?

iOS 不支持嵌套框架(参见 technotes)。目前唯一合法的解决方案是 link "embedded" 框架直接连接到托管应用程序。

* XCFramework 主要是平台特定二进制文件的集合,不幸的是与嵌入框架无关。

您也必须将 Alamofire 嵌入到您的项目中。

比如你使用的是Carthage,你的框架的Cartfile有Alamofire库。您也必须为您的主应用程序使用相同的 Carfile。此外,您还必须为主应用程序执行其他 Carthage 操作(链接库、添加 运行 脚本)。

如果有人正在寻找 dylib 这个错误的解决方案:

dylib not valid for use in process: mapped file has no cdhash

Build Phases -> Copy to $(BUILT_PRODUCTS_DIR)/$FRAMEWORKS_FOLDER_PATH

中检查Code sign on copy

正如 Berec 指出的那样,不支持在框架中嵌入框架。但还有另一种方法。您可以静态 link 库的所有依赖项,因此在最终框架中,二进制文件还将包含其依赖项的代码。

如果您使用的是 CocoaPods 并且框架的名称是 aFramework 您可以这样做:

  target 'aFramework' do
    pod 'Alamofire', :linkage => :static
  end

然后您可以在没有 Alamofire 框架的应用程序目标中使用创建的 aFramework.framework,因为代码将“嵌入”在 aFramework 的二进制文件中。