Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

440
Vistas
#if canImport() no encuentra marcos con CocoaPods

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'] end

Ahora, 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 #endif

Sin 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" end

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Respuesta 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:

  • SDK adicional es opcional
  • MainSDK tiene clases que adoptan los protocolos de AdditionalSDK
  • MainSDK sabe si hay funciones adicionales disponibles
  • Todo está en la configuración de código cerrado

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

over 4 years ago · Santiago Trujillo Denunciar

0

¿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í)

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda