Hola, aquí está nuestro default_subspec que tiene una subespecificación predeterminada y una subespecificación opcional (que no se tomará porque el valor predeterminado ya está configurado). Esa subespecificación tiene más funciones, pero requiere 8 MB adicionales de tamaño...
`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'] endAhora, en nuestro SDK principal, incluimos SDK adicional con #if canImport(SDK adicional) . Luego proporcionamos código relacionado con SDK adicional entre esos indicadores del compilador, como este:
#if canImport(additionalSDK) //adding optional delegate class ViewController: UIViewController, OptionalDelagate #else //no need for delagete class ViewController: UIViewController #endifSin embargo, después de que el cliente integre nuestro mainSDK, verá que falta el módulo de este framework: AdditionalSDK.framework
¿Cómo es esto posible? Hemos marcado el SDK adicional como opcional en nuestro espacio de trabajo. Hemos intentado configurar SDK adicional como -weak_framework en otras banderas del enlazador (Configuración de compilación), pero esto no ayudó.
Si el cliente integra un SDK adicional , todo funciona bien, porque todos los marcos están vinculados.
Dependencias opcionales, sin CocoaPods funcionan bien, es solo problema de CocoaPods o no se como configurarlo
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" endRespuesta corta: el uso #if canImport(Module) no le permitiría lograr lo que describió en una configuración de código cerrado. Veo algunos malentendidos sobre cómo funciona esta compilación condicional.
Lo que quiero decir es que ya ha creado un marco. Parece que #if canImport se resuelve en tiempo de compilación, por lo que no es dinámico.
Cuando usa mainSDK.framework ya precompilado, la parte #if canImport(additionalSDK) ya se evaluó. Y el resultado depende de la disponibilidad de 'SDK adicional' en la cadena de compilación, cuándo se creó (es decir, en su máquina cuando lo prepara para enviarlo a los clientes), no cuando está vinculado.
Encontré a alguien que luchaba con un problema similar aquí: https://flint.tools/blog/finding-a-weak-linking-solution.html
La buena noticia es que lo que desea lograr es posible mediante enlaces débiles e interoperabilidad de Objective-C .
Estoy trabajando en un breve artículo sobre el tema, mientras tanto, aquí hay un repositorio de ejemplo con una configuración funcional, similar a lo que describiste como requisitos:
https://github.com/amichnia/Swift-framework-with-opcional-frameworks
Es compatible con:
Actualizar:
Terminé un artículo, que debería describir la solución con más detalles. Está disponible en https://medium.com/@amichnia_31596/create-a-mostly-swift-framework-with-opcional-features-7e8a9ac960f9
¿No puede lograr eso diciendo que mainSDK es MainTarget y addedSDK es su AdditionalTarget? Lo que veo es que cualquiera que sea la version que quieras diferente, será solo another target . Puede hacer clic con el botón derecho en el objetivo original, seleccionar duplicar del objetivo actual y luego puede realizar los cambios que desee para vincular marcos dentro de la sección Fases de construcción.
#check1: compruebe que tiene use_frameworks! sin comentar así:
# Uncomment this line if you're using Swift use_frameworks! #check2: intente eliminar ModuleCache si realmente cree que Framework está allí y en el camino correcto. Para eliminar ModuleCache simplemente elimine el directorio ~/Library/Developer/Xcode/DerivedData/ModuleCache , limpie el proyecto y elimine los datos derivados específicos del proyecto solo para estar seguro. Cuando realiza la limpieza normal, el directorio ModuleCache generalmente no se reconstruye.
#check3: inspeccione su marco para ver si contiene una carpeta de Modules con un archivo module.modulemap dentro (haga clic derecho en su marco> Mostrar en Finder> asegúrese de que su mapa de módulos esté allí)