#if canImport() 没有找到带有 CocoaPods 的框架
#if canImport() does not find frameworks with 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
现在,在我们的 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 设置为 -weak_framework in other linker flags(Build settings ) ,但这并没有帮助。
如果客户端集成了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
不能通过说 mainSDK 是 MainTarget 而 additionalSDK 是你的 AdditionalTarget 来实现吗?我看到的是,无论您想要什么 version
不同,它都只是 another target
。您可以右键单击原始目标,select 从当前目标复制,然后您可以在“构建阶段”部分中对链接框架进行更改。
#check1:
检查你有 use_frameworks!
像这样取消注释:
# Uncomment this line if you're using Swift
use_frameworks!
#check2:
如果您真的认为 Framework
在那里并且在正确的路径中,请尝试删除 ModuleCache
。要删除 ModuleCache,只需删除 ~/Library/Developer/Xcode/DerivedData/ModuleCache
目录,清理项目并删除项目特定的派生数据,以确保万无一失。
当您进行正常清理时,ModuleCache 目录通常不会重建。
#check3:
检查你的框架,看看它是否包含一个 Modules
文件夹,里面有一个 module.modulemap
文件(右键单击你的框架 > 在 Finder 中显示 > 确保你的模块映射有吗)
简短回答: 使用 #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 的协议
- MainSDK 知道是否有其他功能可用
- 都是闭源设置
更新:
我完成了一篇文章,应该更详细地描述解决方案。可在 https://medium.com/@amichnia_31596/create-a-mostly-swift-framework-with-optional-features-7e8a9ac960f9
购买
你好,这是我们的 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
现在,在我们的 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 设置为 -weak_framework in other linker flags(Build settings ) ,但这并没有帮助。
如果客户端集成了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
不能通过说 mainSDK 是 MainTarget 而 additionalSDK 是你的 AdditionalTarget 来实现吗?我看到的是,无论您想要什么 version
不同,它都只是 another target
。您可以右键单击原始目标,select 从当前目标复制,然后您可以在“构建阶段”部分中对链接框架进行更改。
#check1:
检查你有 use_frameworks!
像这样取消注释:
# Uncomment this line if you're using Swift
use_frameworks!
#check2:
如果您真的认为 Framework
在那里并且在正确的路径中,请尝试删除 ModuleCache
。要删除 ModuleCache,只需删除 ~/Library/Developer/Xcode/DerivedData/ModuleCache
目录,清理项目并删除项目特定的派生数据,以确保万无一失。
当您进行正常清理时,ModuleCache 目录通常不会重建。
#check3:
检查你的框架,看看它是否包含一个 Modules
文件夹,里面有一个 module.modulemap
文件(右键单击你的框架 > 在 Finder 中显示 > 确保你的模块映射有吗)
简短回答: 使用 #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 的协议
- MainSDK 知道是否有其他功能可用
- 都是闭源设置
更新:
我完成了一篇文章,应该更详细地描述解决方案。可在 https://medium.com/@amichnia_31596/create-a-mostly-swift-framework-with-optional-features-7e8a9ac960f9
购买