Получить идентификатор пакета из другой цели

В моем проекте XCode у меня есть 4 различные схемы (prod, dev, staging, staging2), которые изменяют идентификатор пакета приложения, которое устанавливается на телефон. Таким образом, я могу установить все 4 версии рядом, аналогично этой технике.

Сейчас я создаю расширение Today для iOS 8. Это новая цель, для которой требуется собственный идентификатор пакета.

Идентификатор пакета расширения должен иметь префикс с идентификатором пакета родительского приложения, иначе выдается предупреждение:

error: Embedded binary's bundle identifier is not prefixed with the parent app's bundle identifier.

    Embedded Binary Bundle Identifier:  com.company.app.TodayExtension
    Parent App Bundle Identifier:       com.company.app.staging

В этом случае встроенный двоичный идентификатор пакета должен быть com.company.app.staging.TodayExtension,

Есть ли способ, которым я могу настроить свою цель Today Extension для установки ее идентификатора пакета, сначала посмотрев на идентификатор пакета родительской цели? Возможно, через пользовательский этап запуска сценария запуска?

1 ответ

Решение

Настройки сборки целей недоступны для других целей. Тем не менее, настройки сборки ПРОЕКТА доступны.

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

Затем на вкладке информации цели расширения приложения установите идентификатор пакета в

$(PARENT_APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME:rfc1034identifier)

Это сработало идеально для меня.

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

  1. Выберите "Редактировать схему"
  2. Нажмите треугольник возле "Построить"
  3. Выберите "Предварительные действия"
  4. Нажмите "+", выберите "Новый запуск сценария"
  5. Выберите цель, чтобы предоставить настройки сборки из
  6. В поле скрипта вставьте следующий с вашим идентификатором и расширением папки
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier 
YourDesiredId" "$PROJECT_DIR/YourExtensionFolder/Info.plist"

И это работает как шарм! Вам необходимо настроить его для каждой схемы.

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

Скажем, существует около 10 целей "приложений", я не могу себе представить добавление расширений содержимого уведомлений и службы уведомлений для каждой основной цели (в этом случае я бы поддерживал всего 30 целей - безумие).

Я запускаю сценарий (https://gist.github.com/damian-rzeszot/0b23ad87e5ab5d52aa15c095cbf43c59) после этапа "Встраивание расширений приложений". Он переопределяет идентификатор пакета в списках расширений приложения и повторно подписывает пакет.

Другие вопросы по тегам