Получить идентификатор пакета из другой цели
В моем проекте 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 и несколько целей, поэтому, чтобы избежать дублирования расширения для каждой цели, я добавил предварительное действие к каждой схеме, которая изменяет идентификатор расширения перед сборкой:
- Выберите "Редактировать схему"
- Нажмите треугольник возле "Построить"
- Выберите "Предварительные действия"
- Нажмите "+", выберите "Новый запуск сценария"
- Выберите цель, чтобы предоставить настройки сборки из
- В поле скрипта вставьте следующий с вашим идентификатором и расширением папки
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier
YourDesiredId" "$PROJECT_DIR/YourExtensionFolder/Info.plist"
И это работает как шарм! Вам необходимо настроить его для каждой схемы.
В моем проекте мне нужно создать разные версии приложений (различаются деталями, например, каждое приложение имеет свой логотип).
Скажем, существует около 10 целей "приложений", я не могу себе представить добавление расширений содержимого уведомлений и службы уведомлений для каждой основной цели (в этом случае я бы поддерживал всего 30 целей - безумие).
Я запускаю сценарий (https://gist.github.com/damian-rzeszot/0b23ad87e5ab5d52aa15c095cbf43c59) после этапа "Встраивание расширений приложений". Он переопределяет идентификатор пакета в списках расширений приложения и повторно подписывает пакет.