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.
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