2009-05-15 4 views
38

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

ответ

1

Documentation

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

[-target Имя_целевого_объект]

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

Это будет в основном выполнять то, что вы просите.

+0

Спасибо. Я видел это, и это не так изящно, как хотелось бы, но я думаю, что все равно будет работать так, как я этого хочу. –

+7

Вы должны снять этот флажок как правильный ответ. Ответ Роба правильный. Просто попробовал это второй раз, и я мог бы отлично отменить профиль подготовки. – Jonny

77

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

xcodebuild [любые другие варианты у вас есть] PROVISIONING_PROFILE = «[Ваш профиль Unique ID здесь]»

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

+5

Одна вещь, которая меня опрокинула: параметр, который вы видите в интерфейсе XCode, фактически представляет собой две настройки: PROVISIONING_PROFILE и CODE_SIGN_IDENTITY. Если вы выполняете работу с клиентом и имеете несколько идентификаторов подписи, будьте осторожны, чтобы установить их из командной строки. – Bdebeez

+3

Как найти имя PROVISIONING_PROFILE и имя CODE_SIGN_IDENTITY? – Hilen

+3

UDID PROVISIONING_PROFILE поступает из самого профиля. Профили являются технически двоичными файлами, так как они содержат данные подписи, но вы все равно можете открыть их в текстовом редакторе и искать UDID: UUID longstring. CODE_SIGN_IDENTITY - это поле «общего имени» вашего сертификата, которое вы можете видеть в доступе к цепочке ключей. – Rob

25

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

#!/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}" 

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

Примечание: С тех пор я нашел способ установить или обновить профиль подготовки без необходимости включать Xcode вообще - намного чище! Для получения полной информации см. here.

+0

У вас был какой-то успех в поиске способа добавления профиля подготовки из командной строки за последние несколько дней?Это действительно расстраивает то, что такая простая вещь не может быть выполнена из-за негибкости инструментов ... – Shade

+2

не обращайте внимания на мой предыдущий комментарий. Я нашел ответ в этом вопросе: http://stackoverflow.com/questions/4744959/command-line-update-of-provisioning-profiles – Shade

+0

хорошая работа! Я попробую это сегодня +1. – jkp

4

Я понимаю, что это, вероятно, немного не в тему 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 из Keychain для входа в систему и копируя ~/Library/MobileDevice/Provisioning Profiles в папку пользователя ~jenkins/Library/MobileDevice/Provisioning Profiles пользователя Jenkins.

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

18

Профиль предоставления должен быть предоставлен 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/бен/CodeSign» должен быть разрешен доступ к закрытому ключу, связанному с единицей подписи для этой работы - Следующие ссылки были использованы https://stackoverflow.com/a/21327591/2351246 и Add codesign to private key ACL without Keychain для разблокировки и добавление доступа к кодовым замкам соответственно.

Если архив должен быть впоследствии экспортирован в IPA с использованием xcodebuild, тогда необходимо учитывать следующую проблему (xcodebuild not copying file from .app). Профиль обеспечения должен быть снова поставлен. Фрагмент сценария для создания ИПС является

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 says"resource envelope is obsolete"

Для реализации изменений предложенный Apple Support в указанной статье, выполните следующую команду:

sudo perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication` 
+0

Работал для нас! Спасибо за идею! – Zillan

+0

Один из моих любимые ответы SO когда-либо, так много прекрасных методов для скриптов сборки iOS здесь. Особенно любите метод извлечения UUID из * .mobileprovision. – funkybro

+0

Попытка этого метода дала мне ошибку при генерации архива - последняя команда в первом блоке кода. замените PROVISIONING_PROFILE на APP_PROFILE, чтобы предотвратить создание контейнеров cocoapods с профилем подготовки приложений. Ошибка, которую я имел: Профиль предоставления, указанный в ваших настройках сборки («ПРЕДОСТАВЛЕНИЕ ПРОФИЛЬНОГО ИМЯ»), имеет AppID из «APP_ID», который не соответствует вашему идентификатору пакета «org.cocoapods.Alamofire». – Gorcyn

Смежные вопросы