ios - #if canImport() 没有找到带有 CocoaPods 的框架

标签 ios swift cocoapods ios-frameworks podspec

你好,这里是我们的 Podspec,它有一个 default_subspec 和一个可选的 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

现在,在我们的 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

但是,在客户端集成我们的 mainSDK 后,他看到这个框架缺少模块:additionalSDK.framework

这怎么可能?我们在工作区中将 additionalSDK 标记为可选。我们已尝试将 additionalSDK 设置为 other linker flags(Build settings)中的 -weak_framework,但这没有帮助。

如果客户端集成了additionalSDK一切正常,因为所有框架都是链接的..

可选的依赖项,没有 CocoaPods 也能正常工作,这只是 CocoaPods 的问题或者我不知道如何配置它

s.platform = :ios
s.ios.deployment_target = '9.0'
s.name = "mainSDK"
s.summary = "mainSDK IOS SDK"
s.requires_arc = true

# 2
s.version = "1.0.8.6.5"

s.source = { :http => "https://s3-eu-west-1.amazonaws.com/zipOfSDK.zip"}
s.framework = "UIKit"

s.source_files = "mainSDK.framework/Headers/*.h"

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

s.swift_version = "4.2"

end

最佳答案

简短回答:使用 #if canImport(Module) 不会让您实现您在闭源设置中描述的内容。我发现对这种条件编译的工作原理存在一些误解。

我的意思是您已经构建了一个框架。似乎 #if canImport 是在编译时解析的,所以它不是动态的。

当您使用已经预构建的 mainSDK.framework 时,部分 #if canImport(additionalSDK) 已经被评估。结果取决于构建链中“additionalSDK”的可用性,它是何时构建的(因此在您准备将其发送给客户时在您的机器上),而不是链接时。

我发现有人在这里遇到类似的问题:https://flint.tools/blog/finding-a-weak-linking-solution.html

好消息是,使用弱链接和 objective-C 互操作性可以实现您想要实现的目标。

我正在写一篇关于该主题的短文,与此同时,这里是一个具有工作设置的示例存储库,类似于您描述的需求:

https://github.com/amichnia/Swift-framework-with-optional-frameworks

它支持:

  • AdditionalSDK 是可选的
  • MainSDK 的类采用了 AdditionalSDK 的协议(protocol)
  • MainSDK 知道是否有其他功能可用
  • 全部采用闭源设置

更新:

我完成了一篇文章,应该更详细地描述解决方案。可在 https://medium.com/@amichnia_31596/create-a-mostly-swift-framework-with-optional-features-7e8a9ac960f9 获得

关于ios - #if canImport() 没有找到带有 CocoaPods 的框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55077857/

相关文章:

Swift 呈现 ViewController 键盘

swift - 将 Cocoapods 与 App Extension 一起使用

ios - 来自 AppDelegate 的自定义 UINavigationBar

java - 我应该使用哪个 Apple Push Notification Service Java 库?

IOS:UICollectionView 未在单元格中显示完整图像

ios - 有选择地使用_framework!在椰子足类中

ios - 希望将内容固定在视差标题下方的分段 Controller 上方

iphone - 在没有私有(private) API 的情况下实现自定义 UITabBarController

ios - 设置 CVCalendar

ios - 如何让 UITableViewCell 全屏显示(允许分页)?