混合语言(ObjC+Swift)动态框架中的公共swift类导入“私有”模块

Dan*_*iel 3 frameworks objective-c ios swift swift-framework

我有一个动态框架MyFramwork.framework,其中 Swift 代码和 ObjC 标头标记为 Protected (在 MyFramwork.framework 内部使用)和 Public (由应用程序外部使用)在框架的项目。MyFramwork.framework 也是 App 中的嵌入式框架

按照这里提到的步骤http://nsomar.com/project-and-private-headers-in-a-swift-and-objective-c-framework/,我创建了一个

module MyFramwork_Private {
    header "../...h"
    ...

    export *
}
Run Code Online (Sandbox Code Playgroud)

带有所有受保护的标头(SWIFT_INCLUDE_PATHS = module.modulemap 文件所在目录的路径)

和一个PublicHeaders.h(我在我的伞头中导入的MyFramwork.h)和所有公共头

如何制作使用 MyFramwork 私有代码的公共 Swift 类/结构在 App 中可用?

如果我import MyFramwork_Private在来自 MyFramwork 的 swift 文件中,应用程序在构建 MyFramwork.framework 时,将尝试访问中定义的私有标头module MyFramwork_Private并且构建失败,因为应用程序看不到受保护的标头

Tob*_*kka 5

我也一直在努力解决这个问题,这就是我发现对我有用的东西:

  1. 除了您已经采取的步骤之外,请确保您在 $(SRCROOT)/Myframework 中创建另一个模块映射(例如 MyFramework.private.modulemap)并将以下内容添加到此文件中:

    module MyFramework_Private { export *
    }

  2. 在 .xcconfig 文件中编辑以下选项: SWIFT_INCLUDE_PATHS = $(SRCROOT)/MyFramework MODULEMAP_PRIVATE_FILE = $(SRCROOT)/MyFramework/MyFramework.private.modulemap

在此之后,您应该一切顺利,使用您的框架的应用程序现在应该清楚地了解 MyFramework_Private 是什么,并且您的内部 Swift 文件可以访问私有标头。让我知道它是如何为您解决的,如果可以,我很乐意提供帮助。