Настройте приложение iphone для разных клиентов - PullRequest
12 голосов
/ 22 декабря 2010

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

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

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

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

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

Ответы [ 7 ]

9 голосов
/ 28 декабря 2010

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

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

6 голосов
/ 22 декабря 2010

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

1) основной код приложения хранится в папке «application_name-base»

2) отличаетсяклиенты находятся в своей папке «application_name-client_name»

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

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

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

3 голосов
/ 22 декабря 2010

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

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

1 голос
/ 30 декабря 2010

Я бы лучше написал несколько автоматов / скриптов вместо использования XCode для таких обязанностей!

http://developer.apple.com/tools/xcode/automatorforxcode.html

0 голосов
/ 28 декабря 2010

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

0 голосов
/ 24 декабря 2010

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

0 голосов
/ 22 декабря 2010

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

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