Можно ли «установить» файл Xcode .mobileprovision из командной строки?

Я пытаюсь автоматизировать процесс создания приложений для наших клиентов с помощью сценариев bash, работающих на Mac Mini Server (OSX 10.7).

Мой скрипт основан на невероятно полезном скрипте с github, первоначально опубликованном по адресу https://gist.github.com/949831

Я создаю приложение с помощью xcodebuild, а затем подписываю и встраиваю файл mobileprovision с помощью xcrun.

Когда я делаю все это с файлом mobileprovision, который я вручную установил в Xcode с помощью графического интерфейса (например, двойным щелчком), он работает нормально. Если я просто попытаюсь использовать файл mobileprovision, скопированный на сервер с помощью SCP, произойдет сбой (ошибка кодового знака: профиль обеспечения «123abc123» не может быть найден).

Предположительно, это связано с тем, что файл не «установлен».

Есть ли способ установить файл mobileprovision с терминала? Я использую SSH, поэтому использование таких вещей, как команда «открыть», не сработает.

Спасибо!


person Ben Clayton    schedule 01.05.2012    source источник


Ответы (7)


Если вы не хотите загружать внешние зависимости (как это сделал Бен), в большинстве случаев должно работать следующее:

uuid=`grep UUID -A1 -a adhoc.mobileprovision | grep -io "[-A-F0-9]\{36\}"`
cp adhoc.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$uuid.mobileprovision

Обратите внимание, UUID состоит из шестнадцатеричных цифр, поэтому правильный диапазон [-A-F0-9], а не [-A-Z0-9].

Бонус: скачать и установить профили

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

ios profiles:download:all --type distribution

for file in *.*provision*; do
    uuid=`grep UUID -A1 -a "$file" | grep -io "[-A-F0-9]\{36\}"`
    extension="${file##*.}"
    echo "$file -> $uuid"
    mv -f "$file" ~/Library/MobileDevice/Provisioning\ Profiles/"$uuid.$extension"
done

cupertino (команда ios) может быть установлена ​​с помощью sudo gem install cupertino.

person nschum    schedule 27.05.2012
comment
Это прекрасно сработало, когда мне пришлось установить новый профиль подготовки на наш удаленный сервер jenkins, размещенный в другом состоянии. - person Matt S.; 04.07.2012
comment
А.. здорово! Я не знал, что вы можете grep двоичный файл. Хороший. - person Ben Clayton; 27.07.2012
comment
@BenClayton Если вы откроете файл в vim, вы увидите, что это в основном простой текстовый список с двоичным заголовком и нижним колонтитулом. Достаточно, чтобы меньше/больше давало вам предупреждение о просмотре двоичного файла. - person Bruno Bronosky; 27.11.2013
comment
Двоичные данные представляют собой криптографическую подпись. Цитата из этого сообщения в блоге : Каждый профиль обеспечения на самом деле представляет собой подписанный PKCS#7 plist. PKCS расшифровывается как Стандарты криптографии с открытым ключом. PKCS#7 — это версия, поддерживающая синтаксис криптографических сообщений. Apple использует эти подписанные списки, чтобы ОС могла убедиться, что устанавливаемое приложение принадлежит нужному разработчику и что содержимое списка не было изменено. - person TachyonVortex; 20.06.2014
comment
Вместо использования grep для извлечения UUID вы можете использовать инструменты Apple security и PlistBuddy — см. этот ответuuid=$(/usr/libexec/PlistBuddy -c "Print UUID" /dev/stdin <<< $(/usr/bin/security cms -D -i adhoc.mobileprovision)) - person TachyonVortex; 20.06.2014
comment
На самом деле, поскольку UUID состоит из шестнадцатеричных цифр, диапазон буквенных символов идет от A до F, а не от A до Z. Таким образом, правильным шаблоном grep является [-A-F0-9]\{36\}. Кроме того, инструмент Купертино объявил в своем файле README.md, что в настоящее время он не работает. - person Mig82; 11.10.2017
comment
Я заметил, что в MacOS Sierra вам нужно использовать расширенные регулярные выражения в grep с переключателем -E, чтобы это работало. - person nik; 24.01.2018
comment
Обратите внимание, что описанное выше не работает, если вы никогда не устанавливали профиль обеспечения вручную, поскольку Xcode не создает путь назначения до тех пор, пока он ему не понадобится. - person NateEag; 08.10.2018

С тех пор, как я задал этот вопрос, я сам создал решение. Секрет заключается в том, чтобы просто скопировать файл в папку ~/Library/MobileDevice/Provisioning Profiles/, но (вот тут хитрость) переименовать в [The UUID].mobileprovision.

UUID хранится внутри текстовой части самого файла (в plist). К сожалению, файл также содержит двоичный файл, поэтому «чтение по умолчанию» не может его прочитать. К счастью, этот парень создал небольшую утилиту командной строки для получения UUID (и некоторые другие вещи снова).

Вот мой полный рабочий скрипт:

https://gist.github.com/2568707

person Ben Clayton    schedule 01.05.2012

Сборник всех остальных ответов update_provisioning_profile.sh:

#!/bin/sh
#
# Download and install a single iOS provisioning profile
# Requires https://github.com/nomad/cupertino
#
# Usage
# - Login to your account once:
# ios login
# - Configure TEAM and PROFILE (instructions below)
# - Run update_provisioning_profile.sh at anytime, usually after adding/removing devices to the profile

# Configure the team identifier
# Copy it from developer portal or just use cupertino to get it:
# ios devices
# Copy the string in parens and set it as TEAM
TEAM="team id"

# Configure the profile name you want to manage
# Copy it from developer portal or use cupertino to get a list (ignoring Xcode managed profiles):
# ios profiles --team ${TEAM} | grep -v 'iOS Team Provisioning Profile'
# Copy the name as-is and set as PROFILE
PROFILE="profile name"

# Fetch the profile using `cupertino` tool
# you need to run `ios login` once to setup the account
ios profiles:download "${PROFILE}" --team ${TEAM}
PROFILE_FILE=`echo $PROFILE | tr ' ' '_'` # `cupertino` tool will replace spaces with _
UUID=`/usr/libexec/PlistBuddy -c 'Print :UUID' /dev/stdin <<< $(security cms -D -i ${PROFILE_FILE}.mobileprovision)`

# copy where Xcode can find it
cp ${PROFILE_FILE}.mobileprovision "$HOME/Library/MobileDevice/Provisioning Profiles/${UUID}.mobileprovision"

# clean
rm ${PROFILE_FILE}.mobileprovision

Легко адаптируется к вашим потребностям в обеспечении.

person djromero    schedule 04.10.2014
comment
Купертино перестал работать из-за недавнего изменения на портале разработчиков Apple. Поддерживаемой альтернативой является использование космического корабля для связи с серверной частью Apple Developer или использование любого из инструментов быстрой полосы, таких как match или sigh. github.com/nomad/cupertino - person AnneTheAgile; 15.02.2017

Мы запускаем наши сборки в Jenkins, и у нас была аналогичная проблема. Наш профиль подготовки Ad Hoc меняется довольно часто, и мы не хотим бегать по каждому из наших ведомых устройств сборки, устанавливая их в xcode каждый раз, когда они меняются, поэтому вот что мне нужно сделать:

/usr/bin/xcrun -sdk iphoneos PackageApplication -v <path to yourapp.app> -o <path to your .ipa file> --sign "<Name of signing identity>" --embed <path to .mobileprovision file>

«» — это то, что вы видите в разделе «Подписание кода» в настройках сборки вашей цели.

person jpancoast    schedule 02.05.2012
comment
Это интересно, спасибо! К сожалению, этот подход не сработал для меня, так как я пытался каждый раз автоматически создавать для нового клиента (например, «Имя подписывающего удостоверения» менялось для каждой сборки, в отличие от вашего случая), и xcodebuild не находил их подготовку profile, если только я не выполнил шаг «установить», используя сценарий в своем ответе. - person Ben Clayton; 03.05.2012

Похоже, что Apple добавила пустую строку в файл профиля обеспечения .mobileprovision под каждой парой ключ-значение, и параметр grep больше не работает.

Вот как получить его с помощью PlistBuddy и безопасности с помощью скрипта Python.

command = "/usr/libexec/PlistBuddy -c 'Print :UUID' /dev/stdin <<< $(security cms -D -i abc.mobileprovision)"
uuid = os.popen(command).readline().rstrip('\n')
person indiantroy    schedule 12.08.2014
comment
Я могу подтвердить, что Apple добавила пустую строку под каждой парой ключ-значение. Но поскольку это не между ключом и значением, поиск по-прежнему работает для каждого файла, который я тестировал. - person nschum; 20.08.2014
comment
@nschum, тогда у меня могут быть проблемы с grep. Но в любом случае я думаю, что подход, который я использую сейчас, лучше, чем текстовый поиск, на случай, если Apple внесет дальнейшие изменения в формат профиля обеспечения. - person indiantroy; 20.08.2014
comment
@nschum, я только что проверил grep, который использовал, и он точно такой же, как у вас в исходном ответе. У меня он был сломан, и после переименования профиль подготовки получил пустое имя. - person indiantroy; 20.08.2014
comment
Я только что заметил, что некоторые профили подготовки теперь имеют UUID нижнего регистра. В том случае это могло быть причиной. - person nschum; 26.08.2014

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

fastlane sigh renew --adhoc -n "provisional-profile-name" --app_identifier "app-identifier" -u "user-name" --ignore_profiles_with_different_name

предварительное имя-профиля — это просто имя профиля, не содержит расширения .mobileprovision.

Чтобы создать новый специальный профиль со всеми добавленными UUID устройств,

fastlane sigh --adhoc --app_identifier "app-identifier" -u "username"

Фастфайл,

lane :build do

sigh(
adhoc: true,
app_identifier: "***APP_ID**",
provisioning_name: "**Profile_name**",
username: "Apple_ID",
force: true,
skip_certificate_verification: true,
)


gym(
#export_options: "exportPlist.plist",
scheme: "**scheme-name**",
export_method: "ad-hoc",
xcargs: "PROVISIONING_PROFILE=$SIGH_UUID",
)
end
person Vineeth    schedule 11.09.2017

Похоже, на cupertino в последнее время не было никаких изменений. Fastlane есть инструмент под названием sigh для управления профилями подготовки (создание, загрузка, обновление, восстановление): https://github.com/fastlane/fastlane/tree/master/sigh#readme

person Toland Hon    schedule 26.08.2016