Настройка профиля обеспечения из xcodebuild при создании приложений для iPhone

StackOverflow https://stackoverflow.com/questions/866761

Вопрос

я использую 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

Кажется, работает.Убедись в:

  1. Сначала настройте сборку Xcode как обычный пользователь OSX;создайте оттуда свой дистрибутив, исправив любые проблемы с профилем обеспечения через Xcode;

  2. Получите сборку командной строки, используя xcodebuild, как обычный пользователь OSX;

  3. Затем следуйте инструкциям в сообщении выше к письму, скопировав все сертификаты iOS из связки ключей входа в систему и скопировав ~/Library/MobileDevice/Provisioning Profiles пользователю Jenkins ~jenkins/Library/MobileDevice/Provisioning Profiles папка.

Следующая сборка Jenkins с использованием команд из шага 2 выше должна работать безупречно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top