Профиль обеспечения должен быть предоставлен 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 без связки ключей для разблокировки и добавления доступа к связке ключей для кодового знака соответственно.
Если архив впоследствии будет экспортирован в 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"
Цепочка для ключей должна быть разблокирована во время выполнения этой команды.
UPDATE
На 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`