Настройка профиля обеспечения из xcodebuild при создании приложений для iPhone - PullRequest
40 голосов
/ 15 мая 2009

Я использую xcodebuild для компиляции приложения для iPhone из командной строки. Есть ли способ передать какую-то опцию для настройки профиля обеспечения? Похоже, в целом не так много информации о xcodebuild.

Ответы [ 5 ]

82 голосов
/ 25 июля 2009

На самом деле, вы должны просто добавить его в параметр командной строки XCode.

xcodebuild [любые другие опции, которые у вас есть] PROVISIONING_PROFILE = "[Ваш уникальный идентификатор здесь]"

Предполагается, что параметры сборки из командной строки переопределяют все, поэтому это должно победить все, что определено в проекте или цели.

27 голосов
/ 31 марта 2011

Мое решение не элегантное, но оно делает свою работу и позволяет мне автоматизировать все на сервере сборки:

#!/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 - намного чище! См. здесь для получения полной информации.

20 голосов
/ 17 сентября 2014

Профиль обеспечения должен быть предоставлен 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`
4 голосов
/ 09 августа 2014

Я понимаю, что это, вероятно, немного не по теме OP, но этот вопрос возникает первым при поиске того, как заставить сборки Xcode работать на Jenkins. Размещение дополнительной информации здесь для потомков. И очки. Если вы нашли это полезным, пожалуйста, дайте очки:)

Во всяком случае, в последнее время несколько раз проходил на этом раунде. Нашел это:

http://code -dojo.blogspot.co.uk / 2012/09 / FIX-КСН-подписывания кода-эмиссионные когда-using.html

Кажется, работает. Обязательно:

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

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

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

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

1 голос
/ 15 мая 2009

Документация

Из документа видно, что вы не можете установить файл обеспечения, НО вы можете указать цель:

[- target targetname]

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

Это в основном выполнит то, что вы просите.

...