如何使Swift框架子模块真的私有?

问题描述 投票:8回答:2

我发现了另一个问题,它带来了有关问题和可能解决方案的更多细节。似乎有一个已知的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"
    }
}

没运气。

swift module frameworks cocoapods access-control
2个回答
3
投票

我发现了另一个问题,它带来了关于问题和可能的解决方案的更多细节(虽然不起作用)。似乎有一个已知的bug是未来改进的主题。

Objective C classes within an iOS Swift-based dynamic framework


1
投票

我最近遇到了完全相同的问题。快速回答是你不能:)即使你声明“私有”模块映射,它总是可以由框架用户导入。请注意,通常情况下,这不是一个问题,特别是对于开源。你只是说“这是一个内部模块,不要使用它”。

但是(总有但是) - 你可以拥有行为,它实际上是相同的 - 允许你使用具有相同框架目标的Objective-C类,而不是将它们公开。它在闭源设置中工作,我不是100%肯定它会如何表现与pods。

这个案子太复杂了,无法在这里粘贴所有内容。我正在添加关于该主题的文章链接,也许它会对您有所帮助。但诚实地说 - 在您的设置中可能会有一些开销。

Creating Swift framework with private Objective-C members. The Good, the Bad, and the Ugly

Github example project

© www.soinside.com 2019 - 2024. All rights reserved.