Aclaraciones sobre frameworks estáticos vs dinámicos de iOS

115

Debo admitir que con el lanzamiento de iOS 8 estoy un poco confundido acerca de los marcos dinámicos y estáticos en iOS.

Estoy buscando una forma de distribuir una biblioteca que creé y necesito ser compatible con iOS 7 y superior. (Nota: Este será un marco propietario. No puedo usar las mazorcas de cacao y tampoco puedo distribuir la fuente). Esto es lo que ya sé:

  • iOS 8 introdujo "marcos integrados" para iOS, pero, según tengo entendido, no funcionan para iOS 7, solo para iOS 8 y superior.
  • Tengo la opción de distribuir mi biblioteca como una biblioteca estática (archivo .a) y también distribuir los encabezados. Sé que esta es una forma común de lidiar con la situación, pero me gustaría encontrar algo más simple que eso (y también agrupar algunos recursos, si es posible).
  • También descubrí que iOS 7 no admite bibliotecas dinámicas .framework (solo estáticas) porque no admite enlaces dinámicos. Pero iOS 8 lo hace, al igual que los enlaces estáticos.

Y aquí están mis preguntas con respecto a esta información:

  • Vi que puedo crear un objetivo .framework y hacerlo estático, cambiando el tipo Mach-O a "biblioteca estática. ¿Sería suficiente para admitir iOS 7 sin ningún problema, y ​​también para distribuir mi biblioteca como una .framework bundle? Si es así, ¿por qué los "frameworks integrados" en iOS 8 son tan importantes, como sugieren muchos recursos en Internet? ¿Me estoy perdiendo algo?
  • ¿Es necesario codificar el .framework como lo hago con cualquier otra aplicación que hago?
  • ¿Qué sucede si necesito incluir otros recursos (como datos básicos o imágenes) con mi archivo .framework? ¿Necesitaré crear un archivo .bundle separado para eso?
csotiriou
fuente
1
"iOS 7 no admite bibliotecas .framework porque no admite enlaces dinámicos" Esta afirmación no es correcta.
Midhun MP
1
Veo. ¿puedes decirme la oración correcta? ¿Es falso porque iOS 7 admite enlaces dinámicos o porque iOS 7 admite bibliotecas .framework? ¿O ambos?
csotiriou
1
Remeber AVFoundation y CoreGraphics son todos .framework. Probablemente esto le ayude a encontrar las respuestas a todas sus preguntas: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP
Arreglé la sentencia. Ya leí el enlace antes de publicar mis preguntas. Este enlace no explica nada sobre mis preguntas. Comienza desde una biblioteca estática y lo envuelve en un archivo .framework MANUALMENTE. Estoy hablando de un objetivo Cocoa Touch Framework en Xcode 6 y luego cambiar el tipo a una biblioteca estática. No menciona la firma de código (por qué y si es necesario), recursos adicionales, etc.
csotiriou
1
Puede usar CocoaPods para distribuir un marco propietario (por ejemplo, Parse)
Ric Santos

Respuestas:

69

Antes de iOS8, Xcode solo permitía la opción de crear bibliotecas estáticas para iOS. El problema común con eso era que teníamos que enviar el binario y los encabezados por separado.

Más tarde, algunos desarrolladores tuvieron la idea de crear "marcos estáticos". [el .framework es solo una carpeta con enlaces simbólicos a la biblioteca y los encabezados]. Un ejemplo es https://github.com/jverkoey/iOS-Framework

Esta opción funcionará para iOS 7 u 8 o antes. Porque son solo bibliotecas estáticas con la conveniencia de agrupar los archivos de encabezados.

En cuanto a sus preguntas sobre los recursos, necesitaríamos agruparlos en '.bundle'. Para enviarlos, no estoy seguro de poder incluirlos en la carpeta .framework. En el pasado solía enviar mis bibliotecas como un marco estático y un paquete ...

Sin embargo, la opción anterior no funcionará para usted si usa Swift. Xcode no admite la creación de bibliotecas estáticas que incluyan código rápido.

Debe ir con marcos dinámicos si hay un uso rápido. En teoría, los marcos dinámicos funcionan en iOS7. Pero creo que iTunes Connect rechazará si la aplicación está dirigida a iOS7 y usa marcos dinámicos :-).

Espero que esto ayude

Subbu
fuente
17

Con Xcode 9 en adelante, también puede crear marcos estáticos para Swift. Esto es posible debido a la compatibilidad de fuentes ABI. Todo lo que necesita hacer es cambiar la Mach-O typeconfiguración de compilación inferior del objetivo del marco. Esta técnica también es aplicable a Hybrid Frameworks (frameworks con código Swift y Objective-C).

Avijeet Dutta
fuente
Buen consejo. No sé por qué esta respuesta fue anotada ya que me ayudó. \ Target'Build Settings \ Mach-O-Type y seleccione Static Framework.
rustyMagnet
3
La compatibilidad con abi no está disponible en swift 4
csotiriou
8

statico dynamicen el nombre generalmente puntos en un Linking[Sobre] Tipo

Los marcos pueden ser statico dynamic[Verificar estáticos o dinámicos]

Puede cambiar el formato de la biblioteca que tendrá un impacto en un Linkercambiando Framework target -> Build Settings -> Mach-O Type[Acerca de] a Static Libraryo Dynamic Library. Por defecto, Xcode tiene Dynamic Libraryvalor.

Depende de esta configuración se generarán diferentes tipos de binarios

Después de configurar correctamente un consumidor [Enlace vs Insertar]

Static Linker ld : en el momento de la compilación incluirá todo el código del static libraryen el archivo objeto ejecutable.

Dynamic Linker dyld : en tiempo de carga / ejecución intentará encontrar el marco integrado usando @rpath[Acerca de] y vincularlo

[Vocabulario]

yoAlex5
fuente
6

Swift no funciona en bibliotecas estáticas. Si tiene que usar un marco dinámico, debe establecer min iOS en 8.0 porque AppStore rechaza ios 7 con marco dinámico

AliasCocoa
fuente
Puede importar una biblioteca estática en un proyecto basado en
Swift
5

No tengo todas las respuestas, pero intentaré responder algunas de sus preguntas aquí.

  • Recibirá una advertencia por usar estos marcos en iOS 7, sin embargo, eso es todo, una advertencia. Vea esta respuesta .

  • Puede incluir otros recursos como CoreData, sin embargo, deberá crearlos en el código manualmente. Aquí hay un tutorial que muestra cómo crear un modelo de datos centrales.

  • Debe codificar bibliotecas dinámicas de firma para iOS.

  • Debe asegurarse de que su marco sea compatible con arquitecturas de simulador y de dispositivo si planea distribuirlo.

Beau Nouvelle
fuente