Xcode con iOS: crear una biblioteca de manera fácil de ejecutar en modo de debugging, distribuir, repetir

Esto es para Xcode 4.5.x iOS armv7 armv7s y el sim y especifcialmente sobre la configuration del proyecto Xcode / configuration de la construcción del proyecto:

Tengo un proyecto "A" que es una aplicación en la tienda de aplicaciones. Tengo un proyecto "B" que es una biblioteca que se utilizará en A como dependencia, pero que también se distribuye como una biblioteca de terceros a otras empresas para usar en sus aplicaciones. (las aplicaciones de terceros de otras compañías están representadas en este caso como "Y").

Estos son los requisitos:

  • Debe poder ejecutar "A" en el modo de debugging y, por supuesto, depurar el proyecto nested "B" simultáneamente, en la misma compilation / session.
  • Desde "A" puedo CMD + Haz clic en la firma de un método desde "B" y salta directamente a ese file src, donde puedo editar y volver a comstackr, como si fuera del mismo proyecto.
  • Un dev "X" en alguna otra compañía debe poder arrastrar fácilmente nuestra biblioteca "B" a su proyecto "Y", donde "B" es una biblioteca estática con solo los files de encabezado necesarios expuestos. "Y", por supuesto, llama a los methods de un subset de los files de encabezado reales de "B". Solo los files de este subset deben includese en la distribución para Dev "X".
  • Dev "X" no debería modificar nada en su proyecto Xcode, simplemente arrastre la carpeta para "B" (que contiene la lib estática y el subset de los files de encabezado) en su proyecto y click "Copiar resources, crear references, etc. "
  • Necesito poder generar la compilation de la biblioteca estática de "B" fácilmente, en base a los mismos files que he estado editando todo este time mientras reparto y debugging de este proyecto "B" dentro de su proyecto dependiente "A".
  • "B" no tiene resources aparte del código fuente: no hay activos de image, xibs ni nada por el estilo.
  • De "B", hago clic en "Archivo" y Poof! hay una lib estática (debe ser grasa binaria, con eso quiero decir que funciona en el simulador + armv7 + armv7s , ¡por favor!) con los files de encabezado esenciales listos para ser distribuidos.
  • Todo esto debe ser la aprobación de la tienda de aplicaciones -friendly
  • También esto debe ser confiable. No sirve de nada si tengo que volver para hacer muchos cambios de configuration cada vez que agrego un file.

ACTUALIZAR:
* LO MÁS IMPORTANTE : Esto debe ser un repository Puedo ver que es una plantilla completa de lo que estoy buscando, y necesito poder abrir Xcode 4.5.2+ y hacer clic en jugar y ver esto construcción de cosas, sin dolor.

500 puntos para cualquier persona que pueda proporcionarme un proyecto de plantilla que demuestre todo lo que he descrito anteriormente, "A", "B" y "Y" (con la lib estática "B" utilizada como dep). Todo lo que necesito es un set de proyectos esqueleto ("A", "B" (nested dentro de "A") e "Y") que muestra cómo se puede hacer esto. No contenga la respuesta hasta que se publique la recompensa. Si cumple con mis requisitos, me aseguraré de get mis puntos de recompensa.

Me preocupa un poco que, con las limitaciones de Xcode, esto no sea posible de una manera que no sea una molestia completa. Por favor demuéstrame mal.

ACTUALIZACIÓN: decidí que ya no me importa armv6. Adiós, armv6. Crédito adicional si puede get armv6 en la salida dist, junto con armv7, armv7s, i386 / simulator.

PS Prometo que será razonable adjudicar los puntos. No estoy buscando retenerlos en un tecnicismo. Si tu vida dramáticamente less dolorosa en esta área, con mucho gusto te otorgaré los puntos.

Esto no será posible solo en Xcode. Necesitarás algunos scripts de construcción (a los que puedes llamar desde Xcode, por supuesto) debido al conmutador de objective de compilation (simulador, dispositivo, etc.).

Creo que tendrá que agregar encabezados de distribución adicionales a un paso de compilation de "Copiar files" al less. Pero otras modificaciones no deberían ser necesarias si cambias algo.

Hice algo como esto para libturbojpeg, consulte https://github.com/dunkelstern/libturbojpeg-ios para reference. Actualmente coloca una biblioteca de grasa en "lib" si llama al file "build.sh" desde la terminal, pero omite los encabezados de distribución. En el caso de libturbojpeg, necesitaba 2 files de proyecto porque cada destino comstack un subset diferente de files de ensamblador en la biblioteca (mejor no mire el material ensamblador de makefile). Para comstackr necesitará una versión reciente de NASM, ya que la versión de Apple Ships es antigua (consíguelo con cerveza). Publicaré una plantilla para dicho proyecto de compilation de biblioteca en la misma count en breve. (Editará o comentará si se hace aquí con enlaces apropiados)

Basicamente funciona de esta manera:

  1. Cree un script de compilation que llame a xcodebuild para cada objective de plataforma necesario
  2. El proyecto de la biblioteca Xcode debe contener un script para eliminar las bibliotecas construidas en un directory que la secuencia de commands de compilation puede encontrar
  3. Los encabezados adicionales deben copyrse con una acción de destino "Copiar files"
  4. El script de compilation debe fusionar todas las comstackciones de la biblioteca con lipo
  5. Agregue el script de compilation como el objective "Ejecutar script" a su compilation, pero tenga en count que no crea un bucle infinito (o simplemente llamarlo desde el terminal para crear una compilation de versión)
  6. En su proyecto principal, agregue el subproyecto de biblioteca

A continuación, puede distribuir la dirección de salida con los files de encabezado copydos y la biblioteca universal combinada de lipo y utilizar la biblioteca normalmente como subproyecto en su área de trabajo como lo haría normalmente (construye y vincula solo las libs necesarias, no la lib universal, sino que no debería ser problema)

De hecho, esto no resuelve el problema de crear files DSYM para la biblioteca. Pero, normalmente, los símbolos de debugging deben estar en la biblioteca cuando se construye una compilation de debugging. Eliminará los símbolos de debugging en la compilation de la versión y entonces no tendrá DSYM.

Enlace al proyecto de ejemplo: https://github.com/dunkelstern/StaticLibraryTemplate

Estoy usando https://github.com/jverkoey/iOS-Framework para lograr algo bastante similar a tus necesidades. Dale todo el crédito, solo estoy resumiendo cómo lo hago.

Cree una biblioteca estática como de costumbre más estos ajustes:

  • Agregue una fase de files de copy para copyr los encabezados. No uso una fase apropiada de "encabezados de copy" porque leí en algún lugar, no es recomendable para bibliotecas estáticas de iOS.
    • Destino: Directorio de productos
    • Subpath: ${PROJECT_NAME}/Headers
  • Cambia algunas configuraciones:
    • "Dead Code Stripping" => No (para todas las configuraciones)
    • "Eliminar símbolos de debugging durante la copy" => No (para todas las configuraciones)
    • "Estilo de tira" => Símbolos no globales (para todas las configuraciones)
  • Agregue una secuencia de commands de ejecución para preparar un marco con la biblioteca:
    • Utilice el script prepare_framework.sh .

Puede usar el proyecto de biblioteca estática en su aplicación: arrástrelo al proyecto de su aplicación, agregue la biblioteca .a como dependencia y conéctese con ella. Puede depurar la biblioteca junto con su aplicación, ingresar a methods, navegar a las definiciones de símbolos, etc.

El marco preparado se utilizará para distribuir una versión binaria:

En el mismo proyecto de biblioteca estática, agregue un objective agregado:

  • Agregue la biblioteca estática como dependencia.
  • Agregue una fase de script de ejecución para comstackr las architectures faltantes. Utilice el script build_framework.sh .

El script adivina cuál es la otra plataforma y usa xcodebuild para comstackrlo. Luego usa lipo para crear un binary gordo con todas las architectures. El destino de la biblioteca estática de grasa será el tree de estructura que creamos anteriormente. El marco final se copy en la carpeta de productos en la carpeta de compilation.

Con este enfoque, puede:

  • Cree y depure su aplicación con la biblioteca estática como proyecto nested.
  • Cree una versión distribuida de la biblioteca en un solo paso con los encabezados embeddeds en un package tipo marco. El marco integrado se encuentra en el directory Productos del proyecto.
  • Utilice la function Xcode Archive. Por alguna razón, los files finales no se copyn en la location del file. Puedes usarlo para build una versión pelada del marco.

Siéntase libre de clonar un proyecto usando esta técnica para empaquetar la biblioteca: json-framework fork . He modificado ligeramente los scripts, reviso mi tenedor de iOS-framework .

Con respecto a armv6 , supongo que necesitas y iOS SDK 4.3 y agrega manualmente el armv6 literal a la list de architectures válidas y architectures reales. No tengo un viejo SDK para probarlo ahora mismo.

Cocoapods cubre tus necesidades. Aunque la forma estándar de usarla es enviar especificaciones de pod a un repository central de git. Es compatible con la adición de repositorys alternativos para su distribución o si los crea manualmente, consulte aquí . Las ventajas de utilizar cocoapods serían que cumple todos sus requisitos y se está convirtiendo en una forma muy estándar de distribuir bibliotecas (por ejemplo, utilizadas por empresas como facebook y stackmob) y de código abierto (p. Ej., Afnetworking). Por lo tanto, si depende de las bibliotecas de terceros ahora o en el futuro, es probable que cocoapods lo ayude a manejar esa dependencia.