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

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

Мой сценарий основан на чрезвычайно полезном сценарии от github, первоначально размещенном на https://gist.github.com/949831

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

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

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

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

Спасибо!

7 ответов

Решение

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

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

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

https://gist.github.com/2568707

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

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],

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

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

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

Купертино (ios команда) может быть установлен с sudo gem install cupertino,

Сборник всех других ответов 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

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

Похоже, 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')

Мы запустили наши сборки в 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>

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

Используйте fastlane sigh для установки определенного временного файла или вы можете создать новый.

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

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

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

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

FastFile,

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

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

Другие вопросы по тегам