Настройка профиля обеспечения из xcodebuild при создании приложений для iPhone
-
22-08-2019 - |
Вопрос
я использую xcodebuild
чтобы скомпилировать мое приложение для iPhone из командной строки.Есть ли способ передать какую-то опцию для установки профиля обеспечения?Кажется, в целом информации о xcodebuild не так уж и много.
Решение
Судя по документу, вы не можете установить файл обеспечения, НО вы можете указать цель:
[-target имя цели]
Таким образом, если вы создадите цель для каждого файла обеспечения, вы можете выбрать подходящую цель из командной строки.
Это в основном позволит выполнить то, о чем вы просите.
Другие советы
На самом деле, вы сможете просто добавить его в настройку командной строки XCode.
xcodebuild [любые другие параметры, которые у вас есть] PROVISIONING_PROFILE="[Уникальный идентификатор вашего профиля здесь]"
Предполагается, что настройки сборки из командной строки переопределяют все, поэтому они должны преобладать над всем, что определено в проекте или цели.
Мое решение не является элегантным, но оно выполняет свою работу и позволяет мне автоматизировать все на сервере сборки:
#!/bin/bash
TARGET="Your App"
CONFIGURATION="Release"
SDK="iphoneos"
PROFILE_PATH="/Users/jkp/Desktop/foo.mobileprovision"
IDENTITY="iPhone Distribution: Your Company Ltd"
KEYCHAIN="/Users/jkp/Desktop/keychain"
PASSWORD="foobar"
open "${PROFILE_PATH}"
sleep 5
osascript -e "tell application \"Xcode\" to quit"
security unlock-keychain -p ${PASSWORD} ${KEYCHAIN}
xcodebuild \
-target "${TARGET}" \
-configuration ${CONFIGURATION} \
-sdk iphoneos \
CODE_SIGN_IDENTITY="${IDENTITY}" \
OTHER_CODE_SIGN_FLAGS="--keychain ${KEYCHAIN}"
Ключевым моментом здесь является то, что мне не нужно было сначала устанавливать профиль обеспечения.На самом деле у меня есть еще один скрипт, который использует mechanize для загрузки последней копии профиля обеспечения перед каждой сборкой, что означает, что мы можем обновлять профиль (например, добавляя новые устройства) удаленно и получать эти изменения на нашем CI-сервере без какой-либо дополнительной работы.
Примечание: С тех пор я нашел способ установить или обновить профиль обеспечения вообще без необходимости использования Xcode — намного чище!Видеть здесь для получения полной информации.
Профиль обеспечения должен быть предоставлен UUID, в моем случае профили обеспечения регистрируются в системе управления версиями и, следовательно, проверяются вместе с кодом разработчиком/сервером сборки/системой CI.В исходном дереве профили имеют удобочитаемые имена, такие как MyApp.mobileprovison, и расположены в каталоге «ProvisioningProfiles».Чтобы создать архив xcode, профили необходимо переименовать и скопировать в каталог ~/Library/MobileDevice/Provisioning Profiles, прежде чем xcodebuild распознает их.Это фрагмент кода, который можно использовать в сценарии сборки CI.
# The keychain needs to be unlocked for signing, which requires the keychain
# password. This is stored in a file in the build account only accessible to
# the build account user
if [ ! -f $HOME/.pass ] ; then
echo "no keychain password file available"
exit 1
fi
case `stat -L -f "%p" $HOME/.pass`
in
*400) ;;
*)
echo "keychain password file permissions are not restrictive enough"
echo "chmod 400 $HOME/.pass"
exit 1
;;
esac
#
# unlock the keychain, automatically lock keychain on script exit
#
security unlock-keychain -p `cat $HOME/.pass` $HOME/Library/Keychains/login.keychain
trap "security lock-keychain $HOME/Library/Keychains/login.keychain" EXIT
#
# Extract the profile UUID from the checked in Provisioning Profile.
#
uuid=`/usr/libexec/plistbuddy -c Print:UUID /dev/stdin <<< \
\`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\``
#
# Copy the profile to the location XCode expects to find it and start the build,
# specifying which profile and signing identity to use for the archived app
#
cp -f ProvisioningProfiles/MyApp.mobileprovision \
"$HOME/Library/MobileDevice/Provisioning Profiles/$uuid.mobileprovision"
xcodebuild -workspace MyApp.xcworkspace -scheme MyScheme \
-archivePath build/MyApp.xcarchive archive \
PROVISIONING_PROFILE="$uuid" CODE_SIGN_IDENTITY="iOS Distribution"
Чтобы это работало, связка ключей должна быть разблокирована, а инструменту «/usr/bin/codesign» должен быть разрешен доступ к закрытому ключу, связанному с подписью удостоверения. Были использованы следующие ссылки. https://stackoverflow.com/a/21327591/2351246 и Добавить код в ACL закрытого ключа без Keychain для разблокировки и добавления доступа к связке ключей для кода соответственно.
Если архив необходимо впоследствии экспортировать в IPA с помощью xcodebuild, необходимо принять во внимание следующую проблему (xcodebuild не копирует файл из .app).Профиль обеспечения необходимо предоставить еще раз.Фрагмент сценария для создания IPA:
profileName=`/usr/libexec/plistbuddy -c Print:Name /dev/stdin <<< \
\`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\``
xcodebuild \
-exportArchive \
-exportFormat IPA \
-archivePath build/MyApp.xcarchive \
-exportPath $IPADIR/MyApp.ipa \
-exportProvisioningProfile "$profileName"
Связка ключей должна быть разблокирована во время выполнения этой команды.
ОБНОВЛЯТЬ
В OSX Mavericks (v10.9.5) и OSX Yosemite мы начали видеть ошибки подписи кода:
Codesign check fails : ...../MyApp.app: resource envelope is obsolete
Проверьте это сообщение здесь, чтобы узнать причину xcodebuild - codesign -vvvv говорит: «Конверт ресурса устарел»
Чтобы реализовать изменение, предложенное службой поддержки Apple в указанном сообщении, выполните следующую команду:
sudo perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication`
Я понимаю, что это, вероятно, немного не по теме OP, но этот вопрос возникает в первую очередь при поиске того, как заставить сборки Xcode работать на Jenkins.Публикуем здесь дополнительную информацию для потомков.И очки.Если вы нашли это полезным, пожалуйста, поставьте баллы :)
Во всяком случае, в последнее время пару раз проходил по этому поводу несколько раундов.Нашел это:
http://code-dojo.blogspot.co.uk/2012/09/fix-ios-code-signing-issue-when-using.html
Кажется, работает.Убедись в:
Сначала настройте сборку Xcode как обычный пользователь OSX;создайте оттуда свой дистрибутив, исправив любые проблемы с профилем обеспечения через Xcode;
Получите сборку командной строки, используя xcodebuild, как обычный пользователь OSX;
Затем следуйте инструкциям в сообщении выше к письму, скопировав все сертификаты iOS из связки ключей входа в систему и скопировав
~/Library/MobileDevice/Provisioning Profiles
пользователю Jenkins~jenkins/Library/MobileDevice/Provisioning Profiles
папка.
Следующая сборка Jenkins с использованием команд из шага 2 выше должна работать безупречно.