Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

431
Views
#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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!