Xcode 7: изменение идентификатора пакета продукта

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

Я использую плагин Xcode Jenkins для установки идентификатора пакета:

Плагин Jenkins Xcode - подписывание кода и параметры связки ключей OS X

Проблема в том, что это изменит идентификатор пакета в файле Info.plist и в MyTarget> General> Bundle Identifier. Но это не изменит идентификатор пакета в разделе «Параметры сборки»> «Упаковка»> «Идентификатор пакета продукта».

То же самое произойдет, если я сделаю это вручную. Я создаю новый проект в Xcode 7. По умолчанию три значения:

«Информационный  target general before упаковка

Когда я меняю значение в файле Info.plist следующим образом:

Информационный список изменен

Два других значения будут:

target general after  упаковка после

Итак, как вы можете видеть, значение в настройках сборки не меняется. Если я использую Xcode, я изменяю это значение вручную, но если я создаю проект в Jenkins, это проблема бис.

Кто-нибудь сталкивался с такой же проблемой? Как с этим справиться?

Спасибо!


person Luca Torella    schedule 30.09.2015    source источник
comment
С сегодняшнего дня сталкиваюсь с той же проблемой. Я использую команду оболочки plistbuddy для изменения идентификатора пакета. Он изменяет info.plist, но не меняет идентификатор пакета в настройках сборки в xCode.   -  person Sarthak Singhal    schedule 30.09.2015
comment
Большое спасибо, не понял, что его нужно поменять в 3-х местах!   -  person JOM    schedule 08.12.2017


Ответы (6)


Столкнулся с такой же проблемой.

PRODUCT_BUNDLE_IDENTIFIER - это переменная в вашем project.pbxproj файле. Измените это на то, что хотите, и это отразится как в ваших Info.plist, так и в настройках проекта.

person udit gupta    schedule 30.09.2015
comment
так что я должен передать PRODUCT_BUNDLE_IDENTIFIER=$CB_APP_ID в xcodebuild, верно? - person Luca Torella; 30.09.2015
comment
это сработало. Для записи я передаю команду PRODUCT_BUNDLE_IDENTIFIER=$CB_APP_ID команде xcodebuild. - person Luca Torella; 02.10.2015
comment
как ты и куда ты эту PRODUCT_BUNDLE_IDENTIFIER=$CB_APP_ID добавлял? - person Pooja M. Bohora; 26.11.2018
comment
Я добавил в Custom xcodebuild arguments like: PRODUCT_BUNDLE_IDENTIFIER = 'com.w.test', но в настройках сборки это не меняется :( - person Pooja M. Bohora; 26.11.2018
comment
@LucaTorella, не могли бы вы помочь - person Pooja M. Bohora; 03.12.2018
comment
да, это просто лишний xcodebuild аргумент. xcodebuild PRODUCT_BUNDLE_IDENTIFIER="com.w.test" - person Luca Torella; 04.12.2018

ответ udit правильный. Лучше всего в plist установить значение идентификатора пакета как $ PRODUCT_BUNDLE_IDENTIFIER. Затем в настройках сборки используйте разные конфигурации (Debug, Release .etc), чтобы настроить другой идентификатор пакета по требованию: введите описание изображения здесь

Вам больше не нужен плагин xCode для изменения идентификатора пакета, но необходимо указать там конфигурацию.

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

person Aoke Li    schedule 02.10.2015
comment
Я согласен, в большинстве случаев это лучшая практика. Но я хочу, чтобы все эти параметры можно было настраивать. В основном я хочу иметь веб-интерфейс, в котором клиент может добавить файл p12, профиль мобильной подготовки, идентификатор пакета, и они получат настроенный .ipa - person Luca Torella; 02.10.2015
comment
@Aoke Li: Кажется, это лучший подход. У меня только одно сомнение. Когда я использую разные идентификаторы пакета в зависимости от конфигурации сборки, какое значение будет отображаться в общей панели сводки Xcode? - person Rashmi Ranjan mallick; 18.10.2016
comment
@Rashmi Ranjan mallick - Итак, после того, как вы настроите файл конфигурации и выполните локальную сборку, вы заметите, что идентификатор пакета на общей панели также обновился. И поскольку во время сборки jekins для этой области ничего не вводится, подчиненное устройство будет работать точно так же, как ваша машина разработчика. - person Aoke Li; 18.10.2016
comment
@ AokeLi- На самом деле, я не использую Jenkins. Я создаю вручную с помощью функции архива. Мой сценарий - я хочу использовать разные идентификаторы пакетов для разной конфигурации (как вы продемонстрировали). - person Rashmi Ranjan mallick; 18.10.2016
comment
Это не сработает, если вы создаете в своем проекте зависимости сторонних разработчиков, потому что все модули должны согласовывать конфигурации сборки. Большинство из них поддерживают только отладку и выпуск по умолчанию. : / - person quickthyme; 12.07.2019

Обратитесь к this для простого решения для замены $ PRODUCT_BUNDLE_IDENTIFIER с помощью команды оболочки, например -

sed -i '' 's/com.example.oldbundleid/com.example.newbundleid/g' project.pbxproj

Вы можете передавать свои переменные соответственно с помощью Jenkins / Shell.

Альтернативный подход для этого - использование mod-pbxproj.

python -m mod_pbxproj -b -af PRODUCT_BUNDLE_IDENTIFIER=com.example.newbundleid -rf PRODUCT_BUNDLE_IDENTIFIER=com.example.oldbundleid project.pbxproj All

//редактировать

Старый идентификатор пакета можно получить с помощью -

awk -F '=' '/PRODUCT_BUNDLE_IDENTIFIER/ {print $2; exit}' project.pbxproj

Его можно сохранить в строковой переменной и использовать вместо com.example.oldbundleid.

person Sarthak Singhal    schedule 02.10.2015
comment
Было бы лучше, если бы вам не нужно было знать старый идентификатор пакета. - person turingtested; 14.10.2015
comment
Обновил мое решение. Он извлекает сохраненное значение идентификатора пакета из .pbxproj для замены. @turingtested - person Sarthak Singhal; 14.10.2015

Для xcode 8.x

При изменении имени приложения в разделе «Цели»> «your_app_name - Info»> добавление нового ключа свойства не приводит к полному изменению имени приложения везде на протяжении всего проекта.

Когда вы это сделаете, ваш проект будет работать без сбоев только на вашем Mac (то есть в системе, которую вы использовали для этих изменений, поскольку все ваши ключи свойств и идентификаторы будут сохранены в вашей системе). Когда вы пытаетесь использовать свой проект в другой системе, вы получите эту странную ошибку, которая отсутствует в вашем проекте, если вы используете модули в своем проекте.

Итак, чтобы преодолеть это, вам нужно всего лишь внести некоторые изменения в настройки сборки, не трогая вкладки «Общие» и «Информация».

В разделе Цели> Настройки сборки перейдите к Упаковка.

Измените название продукта на желаемое, а идентификатор пакета продукта - на новое. Как только вы это сделаете, автоматически отображаемое имя вашего проекта и идентификатор пакета изменятся на новые на вкладке «Общие».

person user6502515    schedule 21.02.2017
comment
Я использую XCode 9, и это не работает. Приложение взрывается при запуске в симуляторе. - person Logicsaurus Rex; 12.03.2019

Вы также можете просмотреть данные в виде обычного текста, перейдя в «Цели» и выбрав «Уровни», в котором отобразится столбец с идентификатором пакета.

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

person Ron AndKim Stengel    schedule 31.10.2018

Если вы используете bundle id suffixes, не устанавливайте Product Bundle Identifier на вкладке General файла Target Settings.

Установите его на вкладке Build Settings.

Например:

com.company.app${BUNDLE_ID_SUFFIX}
person Denis Kutlubaev    schedule 26.09.2019