Mih*_*ian 20 objective-c clang ios swift
我有一个Objective-C框架(框架A),它公开了一些公共和一些私有头文件.公共标题也在框架的标题中声明.我有第二个与Objective-C框架链接的Swift框架(框架B).
现在,如果我想在BI中导入A的公共头文件,只需要做一个import A.
但是,如何导入私有标头?
我知道桥接头不是一个选项,因为框架不支持.我是否需要以某种方式为私有标头创建单独的伞形头?
rin*_*aro 27
您需要修改框架A,以便导出私有模块.
在项目中创建私有模块映射文件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)在框架A目标的"构建设置"中,搜索"私有模块映射文件"行,并进行以下操作:
$(SRCROOT)/A/private.modulemap
Run Code Online (Sandbox Code Playgroud)不要private.modulemap在"编译源"中包含文件.这会导致不必要的警告.
清理和构建框架A目标.
在框架B Swift文件中.你可以像这样导入私有模块:
import A
import A.Private
Run Code Online (Sandbox Code Playgroud)这个问题发布已经有一段时间了。接受的答案非常好,就我而言,这是一种常见的方法。
问题是,它并不是真正的“私人”。您可以在框架内执行此操作以访问“私有”部分:
// 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 的完整性构成了威胁。
我找到了解决该问题的方法,但是太复杂了,无法将其整体粘贴到此处。
我发了一篇关于它的帖子,没有媒体。也许它会帮助某人检查该问题,这是我文章的链接:
正如 Andrzej Michnia 在他的回答中所注意到的,“私有模块映射”解决方案的问题在于它并不是真正完全私有的,那些“私有”标头仍然可以被某人看到,因为它们仍然包含在我们的框架中。如果有人用这样的“私有”模块打开编译的框架,他仍然会看到你隐藏的所有 .h 文件。
如果我们需要对其他用户完全隐藏 swift 框架中的一些 Objective-c 标头,那么另一种可能的方法就是在手动或使用 bash 脚本构建框架后将它们公开并从我们的框架中删除它们。
您可以创建一个单独的头文件,例如“InternalHeaders.h”,您可以在其中导入您不想公开的所有头文件。然后将此 InternalHeaders.h 导入框架的公共伞头中。公开所有标头,以便您可以编译所有内容。构建框架后,只需从公共伞头中删除“import InternalHeaders.h”,并删除您不想手动或使用 bash 脚本或运行脚本构建阶段公开的所有头文件,仅此而已。
仍然不是一个完美的解决方案,但在某些情况下,快速编写协议以匹配其他答案中提出的每个objective-c接口可能会更容易和更快。
| 归档时间: |
|
| 查看次数: |
11005 次 |
| 最近记录: |