我有一个用Swift编写的iOS dyanmic框架.我还有一堆用Objective C编写的类,我将在我的Swift类中使用(一些是公共的,一些是私有的).但是,我希望Objective C类不会暴露给使用我的框架的项目.
伞头
根据我的理解,我应该#import header.h在我的伞头文件中导入,这通常是FrameworkName.h,然后确保我希望包含在我的Swift类中的所有Objective C头文件都标记为"Public",在Build Phases下 - >标题.
但是,这样做会自动使用我的框架将项目公开给框架使用的所有私有Objective C类.
模块映射(带独立模块)
正因为如此,我已经研究过使用模块映射,这是记录在这里.我看过其他用户的帖子,比如这个和这个,以及这个Github回购.
我成功完成了以下工作:
//SharedClasses/module.modulemap
module SharedClasses {
}
//SharedClasses/module.private.modulemap
module SharedClasses.Private {
header "header.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
问题是在我的项目中(导入了这个框架),这个:
import Framework
import Framework.SharedClasses
Run Code Online (Sandbox Code Playgroud)
允许,然后暴露"隐藏的"Objective C类.也许这就是模块的工作原理?有没有办法让他们真正私密?
模块映射(带框架私有模块)
另外,我尝试module.private.modulemap在框架的根目录下创建一个文件,其中包含以下内容:
explicit module Framework.Private {
header "header.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
然后在MODULEMAP_PRIVATE_FILE下链接我的目标的构建设置.但是,当我import Framework.Private在我的框架的Swift类中执行时,会抛出编译器错误:
"没有这样的模块'Framework.Private'
我不明白为什么会出现这种错误.
模块映射(带私有头)
我注意到在Clang文档中,private提到了一个说明符: …
您好,这里是我们的Podspec,它具有default_subspec和可选的子规范(由于已经设置了默认值,因此不会使用)。该子规格具有更多功能,但需要额外的8MB大小...
`s.default_subspec = 'mainSDK'
s.subspec 'mainSDK' do |mainSDK|
mainSDK.vendored_frameworks = 'mainSDK.framework'
mainSDK.source_files = "mainSDK.framework/Headers/*.h"
end
s.subspec 'additionalSDK' do |additionalSDK|
additionalSDK.source_files = "additionalSDK.framework/Headers/*.h"
additionalSDK.vendored_frameworks =['additionalSDK.framework', 'mainSDK.framework']
end
Run Code Online (Sandbox Code Playgroud)
现在,在我们的mainSDK中,我们在#if canImport(additionalSDK)中包含了AdditionalSDK,然后在这些编译器标志之间提供了与AdditionalSDK 相关的代码,如下所示:
#if canImport(additionalSDK)
//adding optional delegate
class ViewController: UIViewController, OptionalDelagate
#else
//no need for delagete
class ViewController: UIViewController
#endif
Run Code Online (Sandbox Code Playgroud)
但是,客户端集成了我们mainSDK后,他认为,该框架是缺少模块:additionalSDK.framework
这怎么可能?我们已经在工作空间中将AdditionalSDK标记为可选。我们试图设置additionalSDK为-weak_framework在其他连接标志(构建设置),但这并没有帮助。
如果客户端集成了额外的 SDK,则所有框架都将正常运行,因为所有框架都已链接。
可选的依赖关系,没有的CocoaPods做工精良,它的CocoaPods的只是问题或我不知道如何配置它
`s.default_subspec = 'mainSDK'
s.subspec 'mainSDK' do |mainSDK|
mainSDK.vendored_frameworks = 'mainSDK.framework'
mainSDK.source_files = "mainSDK.framework/Headers/*.h" …Run Code Online (Sandbox Code Playgroud)在尝试在框架中开始使用Swift(包括启用模块支持)时,我开始收到这样的消息:
[snip]/<module-includes>:1:1: Umbrella header for module 'PressKit' does not include header 'NPKBaseAppearance.h'
Run Code Online (Sandbox Code Playgroud)
有问题的标题(大约有十个)没有在PressKit.h中列出,但有充分的理由 - 它们包括内部或很少使用的类和类别,我不想向我的框架的大多数用户公开.(其中一些我想在选定的地方公开;其他人不应该暴露.)
将标题标记为私有似乎没有帮助.这是我框架项目中的一个警告,但是每个目标使用框架时出错,所以我不能忽略这个问题.
显然我可以将这些标题添加到我的伞标题中,但我不想这样做.在使用模块时,我是否违反了一些框架设计规则?处理这种情况的推荐方法是什么?
我已经将MobileCoreServices.framework添加到我的Xcode项目中,并将该语句import MobileCoreServices放在文件顶部。
我有代码行
let test = LSApplicationWorkspace.defaultWorkSpace()
和xcode说 Unresolved Identifier LSApplicationWorkspace
我尝试清理和重建项目。有任何想法吗?
swift ×4
ios ×3
clang ×2
frameworks ×2
cocoapods ×1
macos ×1
module ×1
objective-c ×1
podspec ×1
xcode ×1