嵌入在根框架中的签名子框架无法工作(Xcode 11.2.1)

34
我有一个小的概念验证应用程序,我试图在我的框架(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.

我做错了什么?

enter image description here

enter image description here

enter image description here

enter image description here


3
我这里也遇到了同样的问题。目前正在深入研究这个问题。如果你已经找到解决方案,请及时告诉我! - makle
2
很高兴看到我不是唯一一个......如果我发现了,我会告诉你的。同时,请让我知道你是否有任何进展。 - geekyaleks
3
是的,这个签名过程有些问题……目前,我将我的Alamofire框架包含到自己的框架中,然后在那里对其进行签名和嵌入,并在应用程序本身中进行签名和嵌入。我知道这有点糟糕,但这至少让我能够继续编码,希望很快能有一个真正的解决办法。 - geekyaleks
1
非常感谢您提供如此全面的答案。我已经决定目前只是在应用程序本身中签署“嵌入式/嵌入式”框架,希望不久将来会有其他答案出现... - geekyaleks
你如何在应用程序中“签署”嵌入式框架?@geekyaleks - DàChún
显示剩余4条评论
4个回答

33

苹果iOS不支持嵌套的框架(请参见技术说明)。目前唯一的合法解决方案是将“嵌入式”框架直接链接到托管应用程序。

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


5
有关这个问题的任何消息吗?我面临着相同的问题:我的框架 A 正在使用我的框架 B,而我需要最终应用程序只包含框架 A,不能访问框架 B。 - Silvia
@Silvia 如果你绝对需要隐藏B,那么我相信你可以将其转换为静态库。 - berec
我不得不将嵌入式框架复制到客户端应用程序的框架目录中 - 感谢您的答案。 - dazza5000
谢谢你挽救了我的一天。现在,我清楚地了解如何在iOS中处理Umbrella框架。 - Avinash B

1

你需要将Alamofire嵌入到你的项目中。

例如,如果你正在使用Carthage,并且你的框架的Cartfile中有Alamofire库,那么你也必须在主应用程序中使用相同的Cartfile。此外,你还需要执行其他Carthage操作(链接库、添加运行脚本)以供主应用程序使用。


1
是的,我也发现了这一点,但我的目标不是让所有的框架都暴露给最终开发人员。我希望所有东西都能被很好地打包在一个框架(我的框架)中。谢谢。 - geekyaleks

0

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

如果您正在使用CocoaPods并且框架的名称为aFramework,则可以执行以下操作:

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

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


0

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

dylib无法在进程中使用:映射文件没有cdhash

请在Build Phases -> Copy to $(BUILT_PRODUCTS_DIR)/$FRAMEWORKS_FOLDER_PATH中勾选Code sign on copy


已经检查过了,似乎以上对iOS没有任何作用。 - Top-Master

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接