相关疑难解决方法(0)

基于iOS Swift的动态框架中的Objective C类

情况:

我有一个用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提到了一个说明符: …

frameworks module clang ios swift

20
推荐指数
1
解决办法
2391
查看次数

#if canImport()未找到带有CocoaPods的框架

您好,这里是我们的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)

ios ios-frameworks cocoapods podspec swift

6
推荐指数
1
解决办法
1021
查看次数

从框架伞标题中排除内部标题

在尝试在框架中开始使用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中列出,但有充分的理由 - 它们包括内部或很少使用的类和类别,我不想向我的框架的大多数用户公开.(其中一些我想在选定的地方公开;其他人不应该暴露.)

将标题标记为私有似乎没有帮助.这是我框架项目中的一个警告,但是每个目标使用框架时出错,所以我不能忽略这个问题.

显然我可以将这些标题添加到我的伞标题中,但我不想这样做.在使用模块时,我是否违反了一些框架设计规则?处理这种情况的推荐方法是什么?

macos objective-c clang swift

5
推荐指数
1
解决办法
1160
查看次数

在Swift中使用LSApplicationWorkspace

我已经将MobileCoreServices.framework添加到我的Xcode项目中,并将该语句import MobileCoreServices放在文件顶部。

我有代码行

let test = LSApplicationWorkspace.defaultWorkSpace()

和xcode说 Unresolved Identifier LSApplicationWorkspace

我尝试清理和重建项目。有任何想法吗?

xcode frameworks iphone-privateapi ios swift

4
推荐指数
1
解决办法
2420
查看次数