¿Biblioteca? ¿Estático? ¿Dinámica? O marco? Proyecto dentro de otro proyecto

151

Tengo una aplicación iOS existente y quiero agregar una gran porción de código que he estado desarrollando como otro proyecto solo para facilitar las pruebas. El nuevo fragmento básicamente trata de guardar una imagen en varios servicios para compartir, etc. Debido a que ese código para compartir necesita muchas pruebas y futuras actualizaciones, me preguntaba cuál es la mejor manera de incorporar ese fragmento de código en mi aplicación existente.

No sé si debería ser una biblioteca estática, una biblioteca dinámica o un marco, y honestamente, no estoy realmente seguro de cuál es la diferencia, o cómo debo hacerlo y configurarlo en Xcode.

Todo lo que sé es que necesito / quiero mantener una aplicación de prueba y actualización separada para el código compartido y que la aplicación principal lo use.

pizzafilms
fuente
Puede crear un marco paraguas que es algo así como 'marco dentro del marco' stackoverflow.com/a/27638841/1582217
Mohd Iftekhar Qurashi
posible duplicado de Cómo crear un marco de Umbrella en iOS SDK?
Mohd Iftekhar Qurashi

Respuestas:

204

Primero, algunas definiciones generales (específicas para iOS):

Biblioteca estática : una unidad de código vinculada en tiempo de compilación, que no cambia.

Sin embargo, las bibliotecas estáticas de iOS no pueden contener imágenes / activos (solo código). Sin embargo, puedes superar este desafío utilizando un paquete de medios .

Una definición mejor y más formal se puede encontrar en Wikipedia aquí .

Biblioteca dinámica : una unidad de código y / o activos vinculados en tiempo de ejecución que pueden cambiar.

Sin embargo, solo Apple puede crear bibliotecas dinámicas para iOS. No está permitido crearlos, ya que esto hará que su aplicación sea rechazada. (Consulte esta otra publicación SO para obtener confirmación y razonamiento al respecto).

Marco de software : un conjunto compilado de código que realiza una tarea ... por lo tanto, en realidad puede tener un marco estático o un marco dinámico , que generalmente son solo las versiones compiladas de lo anterior.

Vea Wiki en el Marco de Software para más detalles.

Por lo tanto, en iOS, su única opción es básicamente usar una biblioteca estática o un marco estático (la principal diferencia es que un marco estático se distribuye como un .aarchivo compilado con mayor frecuencia, mientras que una biblioteca estática simplemente se puede incluir como un subproyecto; puede ver todo el código, que se compila primero y .ael proyecto utiliza su archivo resultante como una dependencia).

Ahora que estamos claros (er) en estos términos, configurar una biblioteca estática y admitir paquetes de medios para iOS no es demasiado difícil, y hay muchos tutoriales sobre cómo hacerlo. Yo personalmente recomendaría este:

https://github.com/jverkoey/iOS-Framework

Esta es una guía bastante sencilla y no tiene la desventaja de tratar con "bibliotecas estáticas falsas" ... échale un vistazo para obtener más información ...

Una vez que haya creado su biblioteca estática, es tan fácil como incluirla como un submódulo dentro de Git para usar en diferentes proyectos.

Buena suerte.

EDITAR

Con respecto a un subproyecto dentro de un proyecto, hasta donde yo sé, para que esto funcione / compile correctamente, esencialmente debe configurar una cadena de compilación donde el subproyecto se compila primero, lo que crea un .aarchivo de marco estático que se usa como dependencia por el proyecto

Aquí hay otro tutorial útil que habla sobre esto:

http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

EDITAR 2

¡A partir de iOS 8, Apple ahora permite a los desarrolladores crear marcos dinámicos! (Nota: su aplicación debe tener un objetivo mínimo de iOS 8 para incluir un marco dinámico ... no se permite la devolución de puertos).

Esto se ha agregado como una nueva plantilla de proyecto. En Xcode 6.1, esto se puede encontrar en:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
JRG-Developer
fuente
Hasta ahora, parece que el subproyecto es lo que quiero y ese artículo fue perfecto. He notado un efecto secundario extraño: el subproyecto que arrastré dentro de mi proyecto principal también tiene mi código de prueba (viewcontroller y nib, appdelegate, etc.), y me he asegurado de que solo las clases que quiero usar en el El proyecto principal se verifica para ser utilizado en la biblioteca estática. Pero por alguna razón, cuando fui a hacer adjuntos al archivo nib de mi proyecto principal, también mostró salidas y acciones de mi subproyecto. Esto definitivamente podría generar cierta confusión. ¿Algún consejo para deshacerse de ellos? ¡Gracias!
pizzafilms
¿Se puede arrastrar y soltar un proyecto dinámico en un proyecto estático, convirtiéndolo así en un proyecto estático? Estoy realmente confundido, ¡alguna aclaración sería realmente genial! Gracias de antemano :-)
Ravindranath Akila
1
@ JRG-Developer El marco dinámico de portado posterior está permitido si sigue algunas reglas: developer.apple.com/library/prerelease/ios/documentation/…
klefevre
¿Es posible establecer un objetivo mínimo más bajo y hacer que la biblioteca sea opcional?
kukudas
1. ¿Puedes incluir algunos ejemplos conocidos de biblioteca estática, biblioteca dinámica, framework? 2. ¿Puedes dar ejemplos de dónde tendrías que hacer eso? 3. ¿Curioso cuál es la diferencia entre un pod y una biblioteca estática?
Miel
29

Formato de archivo Mach-O (Mach Object - .o)

En el mundo iOS, cada archivo fuente se convierte en archivos de objeto: archivo ABI [Acerca de] Mach-O [Acerca de] que se empaquetará en un paquete ejecutable final (por ejemplo, aplicación, marco ...), archivo (por ejemplo, biblioteca ...) y su comportamiento está determinado por Mach-O type[Acerca de]

Packagees un directorio que se comporta como un archivo - opaque file. Está creado para que la experiencia del usuario complique la realización de algunos cambios en la estructura interna que pueden causar un comportamiento impredecible del programa. El paquete se usa en Document Packageo con a Bundle. Puedes usar Show Package Contentsen un Finder

Bundlees un directorio con una estructura específica para organizar un binario (código ejecutable) y recursos para ese código (por ejemplo, imágenes, plumillas ...). El paquete contiene el archivo Info.plist[Acerca de] . Bundle fue creado para la experiencia del desarrollador . También se puede empaquetar. Hay varios tipos de paquetes:

  • application bundle - Application target
  • framework bundley versioned bundlecomo subtipoFramework Target
  • loadable bundle(aka plug-in bundle) - Bundle target(Paquete de prueba de IU, Paquete de prueba de unidad)
  • otros ( paquete dSYM[Acerca de] )

Application- .ipa, .app[Acerca de] - packaged application bundle- programa ejecutable.

Tests- packaged loadable bundleque se usa para probar un binario. La arquitectura de complemento nos permite agregar una nueva funcionalidad (casos de prueba) como un módulo separado en el binario existente

Bibliotecas y marcos

Martin Fowler en InversionOfControl

Una biblioteca es esencialmente un conjunto de funciones a las que puede llamar, en estos días generalmente organizadas en clases. Cada llamada hace algo de trabajo y devuelve el control al cliente.

Un Framework incorpora un diseño abstracto, con más comportamiento incorporado. Para usarlo, debe insertar su comportamiento en varios lugares del marco, ya sea subclasificando o conectando sus propias clases. El código del marco luego llama a su código en estos puntos. El control principal del programa se invierte, se aleja de usted al marco. (Inversión de control)

Bibliotecas y marcos en iOS

Libraryes una colección de archivos de objetos Mach-O [verificar estáticos o dinámicos] compilados para una o más arquitecturas.

Static library- .a(también conocido como biblioteca de archivos estáticos, biblioteca compartida vinculada estática [doc] ) - Cuando lo agrega a su aplicación, el enlazador estático durante el tiempo de compilación fusionará los archivos de objetos de la biblioteca y los empaquetará junto con los archivos de objetos de la aplicación en un solo ejecutable expediente. La desventaja es un gran archivo de salida

Desde Xcode 9.0, se admite la biblioteca estática Swift.

Dynamic library- .dylib(también conocido como biblioteca dinámica compartida, objeto compartido, biblioteca vinculada dinámicamente [doc] ) se vincula dinámicamente con el ejecutable de la aplicación en carga o tiempo de ejecución , pero no se copia en él. En la práctica, el paquete de la aplicación contendrá la carpeta Frameworks con el .dylibarchivo. Todas las bibliotecas del sistema iOS y macOS son dynamic. La desventaja es un tiempo de inicio lento ya que todas las bibliotecas dinámicas deben copiarse y vincularse.

[Enlace estático vs dinámico]

Text-based stub library- .tbd[Acerca de] , es un trozo de texto dynamic libraryque se encuentra en un dispositivo de destino. Como resultado, no debe empaquetar una biblioteca dinámica en su paquete. Tiene un efecto de tamaño.

Frameworkaka binary framework- .frameworkes un not packaged framework bundle(para permitir a los desarrolladores ver fácilmente los encabezados y recursos) que contiene una static or dynamicbiblioteca compilada , archivos de encabezado y recursos.

Static frameworkcontener un static librarypaquete con sus recursos.

Dynamic frameworkcontiene el dynamic libraryy los recursos. Además de eso, el marco dinámico puede incluir diferentes versiones de la misma biblioteca dinámica en un solo paquete ( versioned bundle)

[Marco estático vs dinámico]

Embedded frameworkes un dynamic frameworkque vive en la caja de arena de la aplicación. Este tipo se creó en primer lugar para la extensión para compartir código y recursos comunes. Está disponible cuando el objetivo de implementación es iOS 8+.

Umbrella framework [Objetivo agregado] es un marco que contiene otros marcos. No es oficialmente compatible con iOS y es por eso que no se recomienda a los desarrolladores crearlos [Documento oficial] . En realidad, es un conjunto de sub-marcos (o marcos anidados). Cuando crea un marco que tiene una dependencia, un consumidor (como una aplicación) es responsable de agregar esta dependencia junto con su marco al proyecto. Como desarrollador, es natural tratar de encontrar una manera de transferir este deber del consumidor al suyo. Como resultado, cree que eseUmbrella frameworkes el rescate, pero generalmente conduce a problemas serios con la administración de versiones y la complejidad de crearlo y respaldarlo.

Fake Framework- es el resultado de operaciones específicas bajo a static librarypara crear un paquete con .frameworkextensión que se comportará como a dynamic framework. Esta técnica se usó cuando Xcode no admitía la creación de un marco ya que no tenía una plantilla de marco. Uno de realización de un marco falso . Con Xcode 6, Apple ha agregado soporte para el marco de iOS.

Modular Framework[Acerca de] -@importes un marco que contiene un.modulemaparchivo dentro. El módulo puede contener submódulos. La principal ventaja es que ahorras tiempo de construcción conModular Framework.

Universal Library or Framework(también conocido como Fat) [lipo] [Objetivo agregado] contiene múltiples arquitecturas. Por ejemplo, su versión de lanzamiento debe admitir un arco que puede regular a través de Build Active Architecture Only [ONLY_ACTIVE_ARCH]

Dependency[Acerca de] Puede usar código de terceros como parte de su objetivo. Le permite reutilizar un código de muchas fuentes como: otro proyecto, proyecto en el mismo espacio de trabajo, otro destino, biblioteca, marco, etc.

Cómo construir y usar una biblioteca estática:

Cómo construir y usar un marco dinámico [cambiar a estático]

[Sistema de compilación Xcode]
[Componentes de Xcode]
[Enlace dinámico]

yoAlex5
fuente
1
En muchos tutoriales de Swift se menciona que Objective C no admite bibliotecas dinámicas, donde Swift admite, [ altexsoft.com/blog/engineering/… ] Pero, como sé, OS8 en adelante Objctive C admite Biblioteca dinámica. ¿Puedes aclarar esto?
pratima
@pratima, puede crear un marco dinámico en Objective-C para iOS
yoAlex5
1
"El marco estático contiene una biblioteca estática empaquetada con sus recursos". ¿De dónde vino esta definición? AFAK, la fase de compilación "Copy Bundle Resources" del marco estático no funciona, al igual que la biblioteca estática. ¿Cuál es la diferencia entre el marco estático y la biblioteca estática?
toshi0383
@ toshi0383 ¿Encontró una manera de fusionar la biblioteca estática (.a) y sus recursos (.bundle) en un solo marco que podemos distribuir al consumidor?
user121095