2010-12-21 27 views
12

Tengo una aplicación existente que necesita compilarse para diferentes clientesPersonalizar aplicación de iPhone para diferentes clientes

Cada cliente requiere su propio icono y pantalla de bienvenida.
También me gustaría poder incluir de forma condicional varias características dependiendo de si el cliente particular las requiere o no.

He intentado configurar diferentes objetivos para cada cliente, pero no he tenido mucha suerte hasta el momento.
Los diferentes recursos con el mismo nombre, pero una ruta diferente siguen confundiéndose.

Idealmente, me gustaría poder crear una aplicación duplicando otro cliente que sea similar y luego solo hacer el mínimo número de cambios para crear la aplicación para el nuevo cliente.

¿Cuál es la mejor manera de configurar esta aplicación?

+0

Gracias por la colocación de una recompensa para este. El mismo problema aqui. FWIW, vea mi pregunta sobre un tema similar: http://stackoverflow.com/questions/4112483/how-does-xcode-handle-import-header-statements-in-with-multiple-targets – makdad

Respuesta

9

Objetivos separados para cada cliente debe ser el camino a seguir. Para las características, sugeriría primero configurar una macro que identifique al cliente en la configuración de destino (en "Macros de preprocesador" en la pestaña de compilación), y luego tener un FeatureDefines.h archivo que tiene este aspecto:

#ifdef macroClientA // assume client A wants features 1 and 3 
# define macroFeature1 
# define macroFeature3 
#endif 

// and similarly for the other clients 

Ahora puede utilizar

#import featureDefines 
#ifdef macroFeature1 

cualquier lugar que necesita para probar si se desea o no función 1.

Para los iconos separados, la configuración de destino puede especificar un archivo info.plist diferente para cada cliente, y esos archivos pueden a su vez especificar un nombre de archivo diferente para el icono.

Para las pantallas de presentación separadas, iOS siempre requiere que la pantalla de presentación se llame Default.png, pero pueden ir a diferentes subdirectorios del directorio de su proyecto. Puede controlar cuál se utiliza para cada objetivo haciendo clic con el botón derecho donde Xcode dice "Grupos & Archivos", seleccionando Membresía objetivo, marcando la casilla de verificación que desea utilizar y asegurándose de que los demás estén desmarcados.

Para recursos, sugeriría asignar nombres a los archivos de recursos de la siguiente manera:

resourceName.ext // recurso genérico que se utilizará si no hay uno específico para cada cliente
resourceName-clientName.ext // cliente- recurso específico

Siguiente estableció un método de recurso-buscador general que se ve algo como esto:

-(NSString *) resourcePathForResourceName: (NSString *) resourceName extension: (NSString *) ext { 
    NSString *clientName; 
    #ifdef macroClientA 
    clientName = @"clientA"; 
    #endif // and similarly for the other clients 
    NSString *clientSpecificName = [NSString stringWithFormat: @"%@-%@.%@", resourceName, clientName, ext]; 
    NSString *genericName = [NSString stringWithFormat: @"%@.%@"]; 
    if ([[NSFileManager defaultManager] fileExistsAtPath: clientSpecificName]) 
    return clientSpecificName; 
    else if ([[NSFileManager defaultManager] fileExistsAtPath: genericName]) 
    return genericName; 
    else 
    // handle the error 
} 

Ejecución de todo el archivo de recursos agarra a través de ese método le permitirá para agregar recursos específicos del cliente a su proyecto sin cambiar una sola línea de código.

+0

Gracias, estoy aceptando esta respuesta, ya que es más o menos la forma en que estaba pensando/esperando resolver el problema. –

3

Puede hacer un objetivo separado para cada cliente y colocar los activos de cada cliente en su propia carpeta con el mismo nombre. Hice algo similar cuando tuve dos proyectos que tenían mucho en común y solo añadí/eliminé los recursos apropiados de cada proyecto.

Con su escenario, en ese momento puede simplemente agregar una nueva carpeta con los recursos específicos del cliente para cada destino y no requerirá ningún cambio de código. Si las rutas son un problema, puede considerar usar el método [UIImage imageNamed:] que no requiere la ruta completa, solo el nombre del archivo.

0

Escriba su código para permitir que un archivo de configuración externo realice la mayor parte de la configuración, luego incluya los activos correctos con sus objetivos. Al tener un proyecto con un nuevo objetivo para cada cliente, puede elegir qué activos se incluyen con cada objetivo. Si tiene problemas con los objetivos múltiples, puede usar git para administrar un proyecto central y luego ramificarlo para cada cliente.

6

Tengo un escenario similar y cómo lo manejo es el siguiente:

1) del código del núcleo de la aplicación se mantiene en un "application_name-base" carpeta

2) diferentes clientes están en su carpeta "application_name-client_name"

3) el archivo del proyecto se encuentra en la carpeta del cliente e incluye las referencias de la carpeta base sin usar la copia.

4) los archivos que deben ser exclusivos para el proyecto del cliente se encuentran en la carpeta del cliente. Usualmente imágenes usando el mismo nombre. o archivos .h .m que deben ser únicos para el proyecto individual. También le permite no incluir archivos proyecto por proyecto.

Mantiene el código central pero permite diferentes códigos por cliente sin generar confusión.

+0

Esto, con diferentes objetivos para especifica qué carpeta de origen usar. Mucho más limpio que la manipulación de nombres. – Nuthatch

0

Solo crearía una interfaz de configuración para que un cliente entre y personalice la aplicación según sus necesidades individuales o de la empresa. Por ejemplo, proporcionar la imagen desde su Biblioteca de fotos, etc.

0

Puede hacer proyectos para cada cliente e incluir todas las fuentes de la misma ruta, sin copiarlas en el directorio del proyecto. Así podrá reemplazar la pantalla de icono/bienvenida en un proyecto, mientras utiliza la misma base de código. Esto parece ser la manera más fácil hasta ahora.

Cuestiones relacionadas