Можно ли установить файл 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 (и некоторые другие вещи снова).
Вот мой полный рабочий скрипт:
Если вы не хотите загружать внешние зависимости (как это делал Бен), в большинстве случаев должно работать следующее:
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