Отдельные цели для каждого клиента должны быть подходящими.Для функций я бы предложил сначала настроить макрос, идентифицирующий клиента в целевых настройках (в разделе «Макросы препроцессора» на вкладке «Сборка»), а затем иметь файл FeatureDefines.h, который выглядит следующим образом:
#ifdef macroClientA // assume client A wants features 1 and 3
# define macroFeature1
# define macroFeature3
#endif
// and similarly for the other clients
Теперь вы можете использовать
#import featureDefines
#ifdef macroFeature1
в любом месте, которое вам нужно проверить, если функция 1 желательна или нет.
Для отдельных значков ваши целевые настройки могут указывать другой info.plistфайл для каждого клиента, и эти файлы, в свою очередь, могут указать другое имя файла для значка.
Для отдельных заставок iOS всегда требует, чтобы заставка называлась Default.png, но они могут быть разнымиподкаталоги вашего каталога проекта.Вы можете контролировать, какая из них используется для какой цели, щелкнув правой кнопкой мыши там, где Xcode говорит «Группы и файлы», выбрав «Целевое членство», затем установив флажок для того, который вы хотите использовать, и убедившись, что остальные не отмечены.
Для ресурсов я бы предложил назвать ваши файлы ресурсов следующим образом:
resourceName.ext // универсальный ресурс, который будет использоваться, если не существует конкретного клиента
resourceName-clientName.ext //специфичный для клиента ресурс
Затем настройте общий метод поиска ресурсов, который будет выглядеть примерно так:
-(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
}
Выполнение всех захватов файлов ресурсов с помощью этого метода позволит вам добавить клиентскиеконкретные ресурсы для вашего проекта без изменения одной строки кода.