如何在Swift框架中导入私有框架头文件?

Mih*_*ian 20 objective-c clang ios swift

我有一个Objective-C框架(框架A),它公开了一些公共和一些私有头文件.公共标题也在框架的标题中声明.我有第二个与Objective-C框架链接的Swift框架(框架B).

现在,如果我想在BI中导入A的公共头文件,只需要做一个import A.

但是,如何导入私有标头?

我知道桥接头不是一个选项,因为框架不支持.我是否需要以某种方式为私有标头创建单独的伞形头?

rin*_*aro 27

您需要修改框架A,以便导出私有模块.

  1. 在项目中创建私有模块映射文件A.这将是这样的:

    A/private.modulemap:

    explicit module A.Private {
    
        // Here is the list of your private headers.
        header "Private1.h"
        header "Private2.h"
    
        export *
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在框架A目标的"构建设置"中,搜索"私有模块映射文件"行,并进行以下操作:

    $(SRCROOT)/A/private.modulemap
    
    Run Code Online (Sandbox Code Playgroud)
  3. 不要private.modulemap在"编译源"中包含文件.这会导致不必要的警告.

  4. 清理和构建框架A目标.

  5. 在框架B Swift文件中.你可以像这样导入私有模块:

    import A
    import A.Private
    
    Run Code Online (Sandbox Code Playgroud)

  • 我如何在框架内部使用私有模块? (5认同)

And*_*nia 7

这个问题发布已经有一段时间了。接受的答案非常好,就我而言,这是一种常见的方法。

问题是,它并不是真正的“私人”。您可以在框架内执行此操作以访问“私有”部分:

// Framework A Swift file
import A.Private
Run Code Online (Sandbox Code Playgroud)

但是如果你在一个应用程序中使用框架 A(或者你将它发送给你的客户),他仍然可以这样做:

// Client App Swift file
import A
import A.Private

// access "private" framework methods and classes
Run Code Online (Sandbox Code Playgroud)

我试图解决这个问题,因为我最近遇到了一种情况,我需要对用户隐藏它(封闭源代码框架) - 我只是不能让任何人访问它,因为它对 SDK 的完整性构成了威胁。

我找到了解决该问题的方法,但是太复杂了,无法将其整体粘贴到此处。

我发了一篇关于它的帖子,没有媒体。也许它会帮助某人检查该问题,这是我文章的链接:

https://medium.com/@amichnia_31596/creating-swift-framework-with-private-objective-c-members-the-good-the-bad-and-the-ugly-4d726386644b


Les*_*ary 5

正如 Andrzej Michnia 在他的回答中所注意到的,“私有模块映射”解决方案的问题在于它并不是真正完全私有的,那些“私有”标头仍然可以被某人看到,因为它们仍然包含在我们的框架中。如果有人用这样的“私有”模块打开编译的框架,他仍然会看到你隐藏的所有 .h 文件。

如果我们需要对其他用户完全隐藏 swift 框架中的一些 Objective-c 标头,那么另一种可能的方法就是在手动或使用 bash 脚本构建框架后将它们公开并从我们的框架中删除它们。

您可以创建一个单独的头文件,例如“InternalHeaders.h”,您可以在其中导入您不想公开的所有头文件。然后将此 InternalHeaders.h 导入框架的公共伞头中。公开所有标头,以便您可以编译所有内容。构建框架后,只需从公共伞头中删除“import InternalHeaders.h”,并删除您不想手动或使用 bash 脚本或运行脚本构建阶段公开的所有头文件,仅此而已。

仍然不是一个完美的解决方案,但在某些情况下,快速编写协议以匹配其他答案中提出的每个objective-c接口可能会更容易和更快。