Impostazione di un profilo di provisioning all'interno xcodebuild quando si effettuano applicazioni per iPhone

StackOverflow https://stackoverflow.com/questions/866761

Domanda

sto usando xcodebuild per compilare la mia applicazione per iPhone dalla riga di comando. C'è un modo per passare in una sorta di opzione per impostare il profilo di provisioning? Sembra che ci sia non molto informazioni su xcodebuild in generale.

È stato utile?

Soluzione

Documentation

Sembra dal documento, non è possibile impostare il file di provisioning, ma è possibile specificare la destinazione:

[- bersaglio targetname]

Quindi, se si crea un obiettivo per ogni file di provisioning, è possibile selezionare la corretta destinazione dalla riga di comando.

Questo sarebbe fondamentalmente compiere ciò che il vostro richiesto.

Altri suggerimenti

In realtà, si dovrebbe essere in grado di aggiungere solo che l'impostazione della riga di comando di XCode.

xcodebuild [qualsiasi altro opzioni avete] PROVISIONING_PROFILE = "[Il tuo profilo ID univoco qui]"

Crea Impostazioni dalla riga di comando si suppone per ignorare tutto, quindi questo dovrebbe avere la meglio su qualsiasi cosa definita nel progetto o di destinazione.

La mia soluzione non è elegante, ma lo fa fare il lavoro e mi permette di automatizzare tutto sul server di build:

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

La cosa fondamentale è che non ho bisogno di installare il profilo di provisioning prima. Io in realtà sono un altro script che utilizza meccanizzazione per scaricare l'ultima copia del profilo di provisioning prima di ogni generazione che significa che possiamo aggiornare il profilo (aggiunta di nuovi dispositivi, per esempio) in remoto e avere quei cambiamenti rilevati dal nostro server CI, senza alcun lavoro supplementare.

Nota: Da allora ho trovato un modo per installare o aggiornare un profilo di provisioning senza bisogno di coinvolgere Xcode a tutti - molto più pulito! Vedere qui per i dettagli .

Il profilo di provisioning deve essere fornita da UUID, nel mio caso i profili di provisioning vengono controllati al sistema di controllo di origine, e sono quindi controllati con il codice dallo sviluppatore / costruire sistema di server / CI. Nella struttura della fonte i profili hanno nomi leggibili quali MyApp.mobileprovison e si trovano in una directory chiamata "ProvisioningProfiles". Per creare un archivio Xcode, i profili devono essere rinominato e copiato nella directory / ~ / Library MobileDevice / Profili di fornitura prima xcodebuild li riconosce. Si tratta di un frammento di codice che può essere utilizzato in uno script CI build.

# 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"

Il portachiavi deve essere sbloccato e lo strumento "/ usr / bin / codesign" deve essere consentito l'accesso alla chiave privata associata firma di identità per questo al lavoro - I seguenti riferimenti sono stati utilizzati https://stackoverflow.com/a/21327591/2351246 e Aggiungi codesign per ACL chiave privata senza portachiavi per lo sblocco e l'aggiunta di accesso portachiavi per codesign rispettivamente.

Se l'archivio è per essere successivamente esportati in un'IPA usando xcodebuild allora il seguente problema deve essere preso in considerazione ( xcodebuild non la copia di file da .app ). Il profilo di fornitura deve essere fornita di nuovo. Il frammento di script per creare un'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"

Il portachiavi dovrà essere sbloccato mentre questo comando è in esecuzione.

UPDATE

su OSX Mavericks (v10.9.5) e OSX Yosemite abbiamo iniziato a vedere gli errori di firma del codice:

Codesign check fails : ...../MyApp.app: resource envelope is obsolete

Controlla questo commento per la causa xcodebuild - codesign -vvvv dice "busta risorsa è obsoleto"

Per implementare la modifica suggerita da Apple Support nel post di riferimento, eseguire il seguente comando:

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

Mi rendo conto che questo è probabilmente un po 'fuori tema OP, ma questa domanda arriva per primo durante la ricerca di come ottenere Xcode costruisce lavorando su Jenkins. Distacco alcune informazioni aggiuntive qui per i posteri. E punti. Se hai trovato questo utile, si prega di dare punti:)

In ogni caso, sono andati diversi giri su questo un paio di volte ultimamente. Ho trovato questo:

http : //code-dojo.blogspot.co.uk/2012/09/fix-ios-code-signing-issue-when-using.html

Sembra funzionare. Assicurarsi di:

  1. Imposta la Xcode costruire come un normale utente OSX prima; farla costruire il vostro distribuibile da lì, fissare eventuali problemi di profilo di provisioning attraverso Xcode;

  2. Prendi l'accumulo riga di comando di lavoro utilizzando xcodebuild, come un normale utente OSX;

  3. Quindi seguire le istruzioni del post di cui sopra alla lettera, copiando tutti iOS certs da Accesso Portachiavi del sistema e la copia ~/Library/MobileDevice/Provisioning Profiles alla cartella dell'utente Jenkins ~jenkins/Library/MobileDevice/Provisioning Profiles.

Il prossimo Jenkins costruire, utilizzando i comandi al punto 2, dovrebbe funzionare senza problemi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top