2009-06-17 8 views

Respuesta

0

He estado pensando en lo mismo. Hasta ahora, todo lo que he podido hacer es hacer un proyecto exactamente como yo quiero y copiarlo en otra carpeta para comenzar un nuevo proyecto. Luego renombro el archivo .xcodeproj y lo abro. Luego, personalizo los conceptos básicos (íconos, default.png, el objetivo, el ejecutable) antes de compilar la nueva aplicación.

Es torpe, y NO la forma en que se supone que la reutilización de código funciona. Estoy seguro de que hay mejores soluciones. Tal vez algún uso inteligente de la gestión de código fuente/control de versiones? Tal vez algo integrado en XCode? ¿Otras ideas? Espero ver más publicaciones aquí.

9

Apple evita el uso de marcos personalizados en el iPhone. Pero puedes usar buenas viejas bibliotecas estáticas. En el 3.0 SDK de GM hay incluso una plantilla de proyecto para eso, pero también puede simplemente configurar un objetivo de biblioteca estática usted mismo.

+0

Véase la respuesta de Michael a continuación. Crear marcos es posible, solo requiere un poco de un enfoque manual. – DougW

0

@Nikolai Ruhe: ¿dónde exactamente prohíbe Apple el uso de marcos personalizados en el iPhone? He leído tanto el iOS Developer Program License Agreement como las Pautas de revisión de App Store, y parece que no se puede encontrar ninguna mención a tal prohibición.

No veo por qué Apple permitiría el uso de bibliotecas estáticas personalizadas y prohibir el uso de marcos personalizados. Tal vez me falta algún otro documento legal?

+0

tal vez sea de arte técnico, como es difícil/imposible crear complementos de iphone para el constructor de interfaz – hfossli

+0

Ningún código puede vincularse con ejecutables de iOS en tiempo de ejecución. Eso es lo que sucede con dylibs, frameworks y complementos; los archivos estáticos están vinculados en tiempo de compilación. Presumiblemente, esto se hace para evitar que las aplicaciones sean furtivas y violen los términos del SDK, o que se exploten de manera no intencional y pongan en riesgo los datos del usuario. (Como su libreta de direcciones, por ejemplo.) –

+0

"Nota: La creación de marcos personalizados no es compatible con iOS". http://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1 –

5

He creado plantillas para Xcode 4 que te permiten construir marcos universales iOS (que funcionan tanto en el dispositivo como en el simulador).

Una vez que las plantillas están instaladas, simplemente selecciona "Marco de iOS estático" cuando crea un nuevo proyecto y hace el resto. También funciona con pruebas unitarias.

https://github.com/kstenerud/iOS-Universal-Framework

+0

Muy bonito. ¡Gracias por compartirlo! –

0

ver este enlace, puede crear un marco absolutamente y utilizarlo. ¿Por qué Apple rechazará tu aplicación si estructuras tu programa? see this link

El marco no es más que la organización estructural de su código. No hay un enfoque directo para hacerlo. pero puedes lograrlo usando un paquete y un objetivo agrigado. Agregue un nuevo paquete a su proyecto y realice el siguiente SDK base: Último iOS (iOS X.X) (en el X.X aparecerá el número del iOS SDK más reciente instalado en su máquina). Arquitecturas: $ (ARCHS_STANDARD_32_BIT) armv6 (es muy importante tener exactamente este valor, incluido el espacio antes de "armv6") Esta configuración es válida para Xcode 4.2, si está utilizando una versión anterior, use el "Estándar (armv6 armv7)" opción. (los valores de esta propiedad dependen del valor del elemento siguiente, por lo tanto, configúrelo primero). Crear arquitectura activa solamente: NO (de lo contrario, no podemos compilar a armv6 y armv7 al mismo tiempo). Arquitectura válida: $ (ARCHS_STANDARD_32_BIT) (es muy importante ser exactamente este valor). Si su Xcode muestra dos líneas con armv6 y armv7, elimine e inserte este valor en una sola línea. Eliminación de código muerto: NO. Enlace con bibliotecas estándar: NO. Tipo Mach-O: Archivo de objetos reubicables. Este es el cambio más importante. Aquí, le indicamos al compilador que trate el Bundle como un archivo reubicable, al hacer esto, podemos convertirlo en un marco con la configuración de envoltura. Otros Indicadores de Enlazador: Esta configuración no es obligatoria, pero si está planeando utilizar cualquier tipo de código C++ (.cpp o.mm) en este marco, Chris Moore (en los comentarios) aconseja utilizar la opción "-lstdC++". En este caso, podría ser una buena idea usar "-ObjC" también, para evitar conflictos en viejos compiladores. Wrapper Extension: framework. Aquí cambiamos el paquete a un marco. Para Xcode, frameworks es solo una carpeta con la extensión .framework, que tiene dentro de una o más fuentes binarias compiladas, recursos y algunas carpetas, una carpeta, generalmente llamada Headers, contiene todos los encabezados públicos. Generar símbolos de depuración: NO (esta es una configuración muy importante, de lo contrario el marco no funcionará en otras computadoras/perfiles). Encabezado del prefijo de precompilación: NO.

crear un destino aggrigated y copia

# Sets the target folders and the final framework product. 
FMK_NAME=FI 
FMK_VERSION=A 

# Install dir will be the final output to the framework. 
# The following line create it in the root folder of the current project. 
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework 

# Working dir will be deleted after the framework creation. 
WRK_DIR=build 
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework 
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework 

# Building both architectures. 
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos 
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator 

# Cleaning the oldest. 
if [ -d "${INSTALL_DIR}" ] 
then 
rm -rf "${INSTALL_DIR}" 
fi 

# Creates and renews the final product folder. 
mkdir -p "${INSTALL_DIR}" 
mkdir -p "${INSTALL_DIR}/Versions" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers" 

# Creates the internal links. 
# It MUST uses relative path, otherwise will not work when the folder is copied/moved. 
ln -s "${FMK_VERSION}" "${INSTALL_DIR}/Versions/Current" 
ln -s "Versions/Current/Headers" "${INSTALL_DIR}/Headers" 
ln -s "Versions/Current/Resources" "${INSTALL_DIR}/Resources" 
ln -s "Versions/Current/${FMK_NAME}" "${INSTALL_DIR}/${FMK_NAME}" 

# Copies the headers and resources files to the final product folder. 
cp -R "${DEVICE_DIR}/Headers/" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/" 
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/" 

# Removes the binary and header from the resources folder. 
rm -r "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/Headers" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/${FMK_NAME}" 

# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product. 
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}" 

rm -r "${WRK_DIR}" 

esto en el guión correr y correr el objetivo de conseguir aggrigate el marco

+0

Deje de enviar solo enlaces a su sitio web. –

+0

@AndrewBarber ¿Crees que es mi sitio web? si solo contesto la pregunta? Sería mucho más feliz si ese fuera mi sitio web :) –

+0

Tenga en cuenta que debe publicar los puntos útiles de una respuesta aquí, en este sitio, o su publicación corre el riesgo de ser eliminada como ["No es una respuesta"] (http: //meta.stackexchange.com/q/8259). Puede incluir el enlace si lo desea, pero solo como una "referencia". La respuesta debería ser independiente sin necesidad del enlace. –

Cuestiones relacionadas