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

#ios #xcode #xcode4 #xcconfig

#iOS #xcode #xcode4 #xcconfig

Вопрос:

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

В моем проекте Xcode есть специальная группа, которая указывает на папку настроек конкретного клиента на диске, поэтому, открыв проект Xcode и выполнив сборку, вы получите сборку одного приложения с настройками текущего клиента. Чтобы переключиться на другого клиента, я меняю место, на которое указывает эта группа на диске. (Я также изменяю и переключаю настройки xcconfig «На основе» в информационной панели проекта, чтобы перезагрузить полное наследование xcconfig; Простое изменение группы, содержащей один или несколько файлов xcconfig, не перезагружает это!) Это отлично сработало для более чем 100 клиентов. Немного утомительно переключать эту папку каждый раз, когда вам нужно создать приложение для другого клиента и убедиться, что xcconfig верен, но это работает.

Сейчас я нахожусь в процессе автоматизации сборки через командную строку и сталкиваюсь с проблемами. Быстрое и грязное решение для указания вышеупомянутой группы Xcode в другую папку настройки состояло в том, чтобы скопировать ProjectName.xcodeproj/project.pbxproj файл ProjectName.xcodeproj/project-template.pbxproj и поместить заполнители внутри этого файла, которые можно удалить и заменить именем и путем нужной папки настройки. Затем временно перезапишите project.pbxproj измененным project-template.pbxproj и создайте, чтобы получить правильное приложение.

Как вы, вероятно, заметили, project.pbxproj был продублирован и изменен и, следовательно, выйдет из синхронизации, поскольку разработчики изменяют оригинал и забывают также обновить шаблон. И, кроме того, мне все равно не следует возиться с файлами pbxproj таким образом — это личные вещи Xcode.

Итак, есть ли лучший способ сообщить Xcode о папке, полной ресурсов, кода и файлов конфигурации, возможно, на этапе сборки с помощью скрипта или переменной среды, а не на уровне группы проекта? Самой сложной частью, по-видимому, является цепочка xcconfig, поскольку у каждого клиента есть свой собственный файл xcconfig, который наследуется от файлов xcconfig для отладки, разработки и распространения одного приложения.

Извините за многословность этого вопроса, но это немного сложно! Любые предложения будут с благодарностью приняты!

Комментарии:

1. Я вижу, прошло 4 года с тех пор, как вы задали этот вопрос — вы нашли хорошее решение? если да, было бы здорово, если бы вы могли опубликовать его!

2. @AviramNetanel Я никогда этого не делал. В последний раз, когда я работал над этим, проект по-прежнему полагался на замену некоторых деталей в pbxproj файле, а затем на вызов xcodebuild .

Ответ №1:

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

Затем вы можете дублировать цель, которая у вас уже есть (щелкните правой кнопкой мыши на цели, выбрав файл проекта в навигаторе проектов Xcode).

Все ваши цели будут скомпилированы с одним и тем же кодом. Вам просто нужно изменить ресурсы в разделе Этапы сборки> Копировать ресурсы пакета, чтобы для каждой цели создавалось другое приложение. Нет необходимости просматривать внутренние файлы Xcode.

Вы даже можете изменить код в своих исходных файлах, добавив макрос препроцессора в параметры сборки (что-то вроде FIRST_CLIENT=1 ), а затем найдите эти определения в своем файле с #if FIRST_CLIENT помощью .

У меня такая настройка проекта, и она работает довольно хорошо :

введите описание изображения здесь

Комментарии:

1. Я попробую — я думаю, это сработает! Потребуется некоторая настройка, но конечный результат, безусловно, будет лучше, чем копаться в внутренностях Xcode.