我发现了另一个问题,它带来了有关问题和可能解决方案的更多细节。似乎有一个已知的bug是未来改进的主题。
Objective C classes within an iOS Swift-based dynamic framework
我正在Swift中开发一个框架,我在框架中使用了一些Objective-C代码。到目前为止,我的模块映射如下所示:
framework module MyModule {
umbrella header "MyModule-umbrella.h"
export *
explicit module Private {
header "MyTools.h"
}
}
我担心的是MyTools.h
的所有API都可以从框架外部看到:例如,如果你使用Cocoapods安装框架,然后你将import MyModule
安装到你的应用程序(而不是MyModule.Private),你就可以访问MyTools.h
,这是不可取的多余的。有没有办法让MyTools从框架外部看不见?
PS。我使用Cocoapods来分发框架,这是我的podspec(最重要的部分):
s.module_map = 'Pod/MyModule.modulemap'
s.frameworks = 'CoreData', 'CoreTelephony', 'SystemConfiguration'
s.resources = 'Pod/Classes/MessageStorage/*.xcdatamodeld'
s.public_header_files = 'Pod/Classes/**/*.h'
s.private_header_files = 'Pod/Classes/MyTools/**/*.h'
s.source_files = 'Pod/Classes/**/*.{h,m,swift}'
PSS。我的伞标题不导入MyTools.h
PSSS。只是试图从主模块中排除标题:
framework module MyModule {
umbrella header "MyModule-umbrella.h"
export *
exclude header "MyTools.h"
explicit module Private {
header "MyTools.h"
}
}
没运气。
我发现了另一个问题,它带来了关于问题和可能的解决方案的更多细节(虽然不起作用)。似乎有一个已知的bug是未来改进的主题。
Objective C classes within an iOS Swift-based dynamic framework
我最近遇到了完全相同的问题。快速回答是你不能:)即使你声明“私有”模块映射,它总是可以由框架用户导入。请注意,通常情况下,这不是一个问题,特别是对于开源。你只是说“这是一个内部模块,不要使用它”。
但是(总有但是) - 你可以拥有行为,它实际上是相同的 - 允许你使用具有相同框架目标的Objective-C类,而不是将它们公开。它在闭源设置中工作,我不是100%肯定它会如何表现与pods。
这个案子太复杂了,无法在这里粘贴所有内容。我正在添加关于该主题的文章链接,也许它会对您有所帮助。但诚实地说 - 在您的设置中可能会有一些开销。
Creating Swift framework with private Objective-C members. The Good, the Bad, and the Ugly