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.
fuente
Respuestas:
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
.a
archivo 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.a
el 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
.a
archivo de marco estático que se usa como dependencia por el proyectoAquí 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:
fuente
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]Package
es 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 enDocument Package
o con aBundle
. Puedes usarShow Package Contents
en un FinderBundle
es 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 archivoInfo.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 bundle
yversioned bundle
como subtipoFramework Target
loadable bundle
(akaplug-in bundle
) -Bundle target
(Paquete de prueba de IU, Paquete de prueba de unidad)dSYM
[Acerca de] )Application
-.ipa
,.app
[Acerca de] -packaged
application bundle
- programa ejecutable.Tests
-packaged
loadable bundle
que 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 existenteBibliotecas y marcos
Martin Fowler en InversionOfControl
Bibliotecas y marcos en iOS
Library
es 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 salidaDesde 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.dylib
archivo. Todas las bibliotecas del sistema iOS y macOS sondynamic
. 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 textodynamic library
que 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.Framework
akabinary framework
-.framework
es unnot packaged framework bundle
(para permitir a los desarrolladores ver fácilmente los encabezados y recursos) que contiene unastatic or dynamic
biblioteca compilada , archivos de encabezado y recursos.Static framework
contener unstatic library
paquete con sus recursos.Dynamic framework
contiene eldynamic library
y 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 framework
es undynamic framework
que 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 framework
es 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 astatic library
para crear un paquete con.framework
extensión que se comportará como adynamic 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] -@import
es un marco que contiene un.modulemap
archivo 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 deBuild 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]
fuente
También puede crear un archivo .podspec para CocoaPods ( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ) y usarlo como cualquier otro pod con el La única diferencia es que es su pod privado y no es visible para el mundo exterior (no estoy seguro de qué sucederá si su pod crea el modelo CoreData, pero ese no es el caso, según tengo entendido).
fuente