Domanda Un file Xcode .mobileprovision può essere "installato" dalla riga di comando?


Sto cercando di automatizzare il processo di creazione di app per i nostri clienti utilizzando script bash in esecuzione su un Mac Mini Server (OS X 10.7).

La mia sceneggiatura è basata sullo script incredibilmente utile di github pubblicato in origine https://gist.github.com/949831

Sto costruendo l'app usando xcodebuild, quindi firmando e incorporando il file mobileprovision usando xcrun.

Quando faccio tutto questo con un file mobileprovision che ho installato manualmente in Xcode usando la GUI (ad esempio doppio clic) funziona perfettamente. Se cerco semplicemente di utilizzare un file mobileprovision copiato sul server con SCP, fallisce (errore di Code Code: il profilo di provisioning '123abc123' non può essere trovato).

Presumibilmente questo perché il file non è "installato".

C'è un modo per installare il file mobileprovision dal terminale? Sto usando SSH quindi usare cose come il comando 'apri' non funzionerà.

Grazie!


44
2018-05-01 13:36


origine


risposte:


Se non si desidera scaricare le dipendenze esterne (come Ben ha fatto), il seguente dovrebbe funzionare nella maggior parte dei casi:

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

Nota che un UUID è composto da cifre esadecimali quindi l'intervallo corretto è [-A-F0-9] e non [-A-Z0-9].

Bonus: scarica e installa i profili

Usando il strumento cupertino, lo snippet seguente scarica tutti i profili di distribuzione dal Portale per gli sviluppatori e li installa.

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 (il ios comando) può essere installato con sudo gem install cupertino.


66
2018-05-27 15:17



Da quando ho fatto questa domanda, ho costruito una soluzione da solo. Il segreto è semplicemente copiare il file nella cartella ~ / Library / MobileDevice / Provisioning Profiles /, ma (ecco la parte più complicata) rinominato in [UUID] .mobileprovision.

L'UUID è contenuto all'interno di una parte di testo del file stesso (in un plist). Sfortunatamente, il file include anche il binario, quindi 'default read' non può leggerlo. fortunatamente questo ragazzo ha costruito una piccola utility da riga di comando per ottenere l'UUID (e alcune altre cose di nuovo).

Ecco il mio script completo di lavoro:

https://gist.github.com/2568707


25
2018-05-01 15:18



Un compendio di tutte le altre risposte 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

Facile da adattare alle vostre esigenze di approvvigionamento.


6
2017-10-04 12:12



Sembra che Apple abbia aggiunto una riga vuota nel file del profilo di provisioning .mobileprovision sotto ciascuna coppia chiave-valore e l'opzione grep non funzioni più.

Ecco come recuperarlo con PlistBuddy e sicurezza usando uno script python

command = "/usr/libexec/PlistBuddy -c 'Print :UUID' /dev/stdin <<< $(security cms -D -i abc.mobileprovision)"
uuid = os.popen(command).readline().rstrip('\n')

3
2017-08-12 22:18



Gestiamo le nostre build in Jenkins e abbiamo avuto un problema simile. Il nostro profilo di provisioning Ad Hoc cambia molto spesso e non vogliamo correre attorno a ciascuno dei nostri schiavi di build installandoli in xcode ogni volta che cambiano, quindi ecco cosa ho avuto modo di lavorare:

/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>

Il "" è ciò che vedi nella sezione "Firma codice" nelle Impostazioni di costruzione del tuo obiettivo.


2
2018-05-02 16:40



Sembra che non ci sia stato alcun recente sviluppo su cupertino. Fastlane ha uno strumento chiamato sigh per gestire i profili di provisioning (creare, scaricare, rinnovare, riparare): https://github.com/fastlane/fastlane/tree/master/sigh#readme


1
2017-08-26 20:56



Usa fastlane sigh per installare un particolare file provvisorio o puoi crearne uno nuovo.

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

provvisorio-nome-profilo è solo il nome del profilo, non contiene la .mobileprovision   estensione.

Per creare un nuovo profilo ad hoc con tutti gli UUID del dispositivo aggiunti,

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

1
2017-09-11 05:18