关于ios:dyld:未在框架内为框架加载库

dyld: Library not loaded for a Framework within a Framework

我试图嵌入一个使用另一个框架的框架,这在模拟器中工作得很好,但它在iOS设备上崩溃:

dyld: Library not loaded: @rpath/FrameworkB.framework/FrameworkB
Referenced from: /private/var/mobile/Containers/Bundle/Application/B072CD7C-8595-4AE4-A506-26832A0F4402/FrameworkTest.app/Frameworks/FrameworkA.framework/FrameworkA
Reason: image not found

这是我在Xcode中的结构:

  • frameworktest.xcodeproj(应用程序项目)
    • frameworka.xcodeproj(可可触摸框架)
      • frameworkb.xcodeproj(可可触摸框架)

应用程序(frameworktest)使用frameworka(嵌入在frameworktest应用程序中)的A类。类A使用来自frameworkb(在frameworka中链接)的类B

这在模拟器中工作得很好,但在设备上不起作用。

这个结构可能看起来有点奇怪,但是我在开发应用程序的过程中一直在开发框架,这就是为什么我想在我的应用程序项目中添加框架项目。

我已经把这个项目上传到了Github上,让你看看,如果你需要仔细观察的话。(类A在appdelegate.m文件中调用)

为什么它在iOS模拟器中工作而不是在设备上?我怎样才能让它在设备上工作?

编辑:

正如Simonthumper在评论中所建议的,我还尝试将FrameworkB.framework添加到Copy Files中,作为frameworka构建阶段的框架目标,但这在控制台中给出了这个错误:

dyld: Library not loaded: @rpath/FrameworkB.framework/FrameworkB
Referenced from: /private/var/mobile/Containers/Bundle/Application/2A38A2BC-9CD7-4AF6-9E50-42C16D92D6B2/FrameworkTest.app/Frameworks/FrameworkA.framework/FrameworkA
Reason: no suitable image found. Did find:
/private/var/mobile/Containers/Bundle/Application/2A38A2BC-9CD7-4AF6-9E50-42C16D92D6B2/FrameworkTest.app/Frameworks/FrameworkA.framework/Frameworks/FrameworkB.framework/FrameworkB: mmap() error 1 at address=0x10012C000, size=0x00008000 segment=__TEXT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/2A38A2BC-9CD7-4AF6-9E50-42C16D92D6B2/FrameworkTest.app/Frameworks/FrameworkA.framework/Frameworks/FrameworkB.framework/FrameworkB


我就这个问题联系了苹果,找到了解决我问题的方法。苹果的技术支持明确表示,我需要将frameworkb.xcodeproj添加到我的应用程序项目中,因此我的项目结构是:

  • frameworktest.xcodeproj(应用程序项目)
    • frameworka.xcodeproj(可可触摸框架)
      • frameworkb.xcodeproj(可可触摸框架)
    • frameworkb.xcodeproj(可可触摸框架)

完成此操作后,应用程序项目可以将frameworkb.framework包含为嵌入库:FrameworkTest.xcodeproj build phases

这解决了我的问题,使它可以在iOS设备上运行。

如果发布时生成崩溃:吊销企业分发证书并创建新证书以解决此问题。一旦我做到了,它就完美地工作了。


我在嵌入式框架方面也遇到过类似的问题,我刚从Github上尝试过您的代码。

选项1(不适合团队合作)

使错误消失的是将frameworkb添加到frameworktest目标的常规选项卡中的嵌入二进制文件中。

选项2

嗯,与其他开发人员共享项目确实很重要:)。你尝试过这种方法吗?在framewroka的构建阶段添加新的复制文件阶段,并将frameworkb添加到frameworks目标中。new copy phase

但我不知道为什么它在模拟器上工作。如果有人知道,请随时发表评论。

干杯