Подтвердить что ты не робот

Настроить приложение iphone для разных клиентов

У меня есть существующее приложение, которое нужно скомпилировать для разных клиентов.

Каждому клиенту требуется собственный значок и заставка.
Я также хотел бы иметь возможность условно включать в себя различные функции, зависящие от конкретного клиента или нет.

Я попытался настроить разные цели для каждого клиента, но пока не имел большой удачи.
Различные ресурсы с одним и тем же именем, но разные пути продолжают смешиваться.

В идеале я хотел бы иметь возможность создавать приложение, дублируя другой клиент, похожий, а затем просто создавайте минимальное количество изменений для создания приложения для нового клиента.

Каков наилучший способ установить это приложение?

4b9b3361

Ответ 1

Разделение целей для каждого клиента должно быть способом. Для функций я бы предложил сначала настроить макрос, идентифицирующий клиента в целевых настройках (в разделе "Макросы препроцессора" на вкладке сборки), а затем имеющий файл 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
}

Запуск всех ваших файлов ресурсов с помощью этого метода позволит вам добавлять ресурсы для клиента в свой проект без изменения одной строки кода.

Ответ 2

У меня есть похожий сценарий, и как я его обрабатываю, это выглядит следующим образом:

1) основной код приложения хранится в папке "имя_файла-базы"

2) разные клиенты находятся в папке "имя_файла-клиента-клиента"

3) файл проекта находится в папке клиента и включает ссылки из базовой папки без использования копии.

4) файлы, которые должны быть уникальными для проекта клиента, находятся в папке клиента. Обычно изображения с тем же именем. или .h.m, которые должны быть уникальными для отдельного проекта. Также позволяет не включать файлы по проекту по проектам.

Сохраняет центральный код, но допускает разный код на клиента, не приводя к путанице.

Ответ 3

Вы можете сделать отдельную цель для каждого клиента и поместить каждый клиентский ресурс в свою собственную папку с тем же именем. Я сделал что-то подобное, когда у меня было два проекта, которые имели много общего и просто добавили/удалили соответствующие активы из каждого проекта.

С помощью вашего сценария в этот момент вы можете просто добавить новую папку с конкретными ресурсами клиента для каждой цели, и это не потребует каких-либо изменений кода. Если пути являются проблемой, вы можете использовать метод [UIImage imageNamed:], который не требует полного пути, просто имя файла.

Ответ 5

Напишите свой код, чтобы внешний файл конфигурации мог выполнять основную часть настройки, а затем включить правильные активы в свои целевые объекты. Имея один проект с новой целью для каждого клиента, вы можете выбрать, какие активы будут включены в каждую цель. Если у вас возникли проблемы с несколькими целями, вы можете использовать git для управления основным проектом, а затем разделить его для каждого клиента.

Ответ 6

Я бы просто создал интерфейс настроек для клиента, чтобы войти и настроить приложение в соответствии с их потребностями в компании/отдельном пользователе. Например, предоставление изображения из их фотобиблиотеки и т.д.

Ответ 7

Вы можете создать проект для каждого клиента и включить все источники с одного и того же пути, не копируя их в каталог проекта. Таким образом, вы сможете заменить значок/заставку в проекте, используя ту же кодовую базу. Это выглядит как самый простой способ.