当我的框架导入其他地方时,为什么我链接为Optional的iOS框架会按需处理?

时间:2019-04-24 23:40:19

标签: optional ios-frameworks

我正在尝试向我公司发布的现有iOS框架中添加功能。新功能要求我们使用第三方提供的许多其他框架。我们希望确保如果客户不想激活新功能,则不需要他们部署这些框架。

当我在自己框架的“目标” /“通用” /“链接的框架和库”部分中引用这些框架时,将它们配置为“可选”。我还在框架的“目标/构建阶段/二进制与库链接”部分中将它们标记为“可选”。我希望这意味着当不存在我的框架时,可以将它们导入xcodebuild中。

这可以在我构建框架的机器上运行,但是只要其他人尝试将其新的Xcode对象导入到带有消息“缺少所需模块'x'”(其中x为顶部的消息)的import语句中,我的框架导入的一级第三方框架。

我尝试删除它们,并将“ -weak_framework {name}”形式的链接器指令添加到构建中,但是我可以从xcodebuild日志中看到,Optional设置无论如何都会更方便地生成这些。

我的框架在相关的情况下使用Swift 5。

我想念什么?

非常感谢您提供任何线索。

1 个答案:

答案 0 :(得分:0)

如果您创建自己的使用第三方框架的框架,并且您想让这些第三方框架成为可选的(但同时只需要您框架的某些功能),那么我认为您需要做的事情很少。< /p>

首先确保那些应该是可选的第三方框架使用 -weak_framework 选项进行链接。看来你已经这样做了。如果您使用 cocoapods 添加那些第三方框架,那么您可能需要在 Podfile 脚本的末尾添加,如下所示,因为 cocoapods 往往会覆盖这些更改并将 -weak_framework 恢复为 -framework,如果您手动进行了更改。

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
        xcconfig_path = config.base_configuration_reference.real_path
        xcconfig = File.read(xcconfig_path)
        xcconfig_mod = xcconfig.gsub(/-framework "ThirdPartyFrameworkName"/, "-weak_framework \"ThirdPartyFrameworkName\"")
        File.open(xcconfig_path, "w") { |file| file << xcconfig_mod }
    end
  end
end

第二件事是,您需要将此第三方框架作为仅实现框架导入您的框架中,您可以像下面那样执行此操作:

@_implementationOnly import ThirdPartyFrameworkName

最后一件事是,在您的代码中,您需要检查此第三方框架是否已实际加载,以便在有人不将此第三方框架添加到他的应用程序时,您的代码不会崩溃。因此,使用第三方框架的框架中的可选功能应首先检查例如此外部框架的给定类是否存在,然后再使用它,如下所示:

if NSClassFromString("ClassNameFromThirdPartyFramework") == nil {
    return // third party framework not available
}
// do something with ClassNameFromThirdPartyFramework here

如果您执行所有这些步骤,它应该可以工作。