Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Documentation

По-видимому, из документа вы не можете установить файл инициализации, но вы можете указать цель:

[- target targetname]

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

Это в основном выполнит ваши просьбы.

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Профиль обеспечения должен быть предоставлен UUID, в моем случае профили подготовки проверяются в систему управления версиями и поэтому проверяются кодом с помощью системы разработчика/сборки/CI. В дереве источников профили имеют человекообразные имена, такие как MyApp.mobileprovison, и находятся в каталоге под названием ProvisioningProfiles. Чтобы создать архив xcode, профили необходимо переименовать и скопировать в каталог ~/Library/MobileDevice/Provisioning Profiles, прежде чем xcodebuild узнает их. Это фрагмент кода, который можно использовать в CI build script.

# 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" должен быть разрешен доступ к закрытому ключу, связанному с подписью идентификации, чтобы это работало. Следующие ссылки были использованы fooobar.com/questions/47406/... и Добавить код для личного ключа ACL без Keychain для разблокировки и добавления доступа к keychain для кода соответственно.

Если архив будет впоследствии экспортирован в IPA с помощью xcodebuild, тогда необходимо учитывать следующую проблему (xcodebuild не копировать файл из .app). Профиль обеспечения должен быть снова поставлен. Фрагмент script для создания 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 Support в указанной статье, выполните следующую команду:

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

Ответ 5

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

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