web-dev-qa-db-fra.com

Définition d'un profil d'approvisionnement à partir de xcodebuild lors de la création d'applications iPhone

J'utilise xcodebuild pour compiler mon application iPhone à partir de la ligne de commande. Existe-t-il un moyen de passer une sorte d'option pour définir le profil d'approvisionnement? Il ne semble pas y avoir beaucoup d'informations sur xcodebuild en général.

40
Steve Klabnik

Documentation

Il semble que dans le document, vous ne pouvez pas définir le fichier de provisioning MAIS vous pouvez spécifier la cible:

[-target targetname]

Ainsi, si vous créez une cible pour chaque fichier de provisioning, vous pouvez sélectionner la cible appropriée dans la ligne de commande.

Cela accomplirait essentiellement ce que vous demandez.

2
Corey Floyd

En fait, vous devriez pouvoir simplement l'ajouter au paramètre de ligne de commande XCode.

xcodebuild [quelles que soient les autres options dont vous disposez] PROVISIONING_PROFILE = "[Votre profil ID unique ici]"

Les paramètres de construction à partir de la ligne de commande sont censés remplacer tout, donc cela devrait l'emporter sur tout ce qui est défini dans le projet ou la cible.

82
Rob

Ma solution n'est pas élégante mais elle fait le travail et me permet d'automatiser tout sur le serveur de 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}"

L'essentiel ici est que je n'avais pas besoin d'installer le profil d'approvisionnement en premier. J'ai en fait un autre script qui utilise mechanize pour télécharger la dernière copie du profil d'approvisionnement avant chaque build, ce qui signifie que nous pouvons mettre à jour le profil (en ajoutant de nouveaux appareils par exemple) à distance et que ces changements soient récupérés par notre serveur CI sans aucun travail supplémentaire.

Remarque: J'ai depuis trouvé un moyen d'installer ou de mettre à jour un profil de provisioning sans avoir à impliquer du tout Xcode - beaucoup plus propre! Voir ici pour plus de détails.

27
jkp

Le profil d'approvisionnement doit être fourni par UUID, dans mon cas, les profils d'approvisionnement sont archivés dans le système de contrôle de source, et sont donc extraits avec le code par le développeur/serveur de build/système CI. Dans l'arborescence source, les profils ont des noms lisibles par l'homme tels que MyApp.mobileprovison et sont situés dans un répertoire appelé "ProvisioningProfiles". Pour créer une archive xcode, les profils doivent être renommés et copiés dans le répertoire ~/Library/MobileDevice/Provisioning Profiles avant que xcodebuild ne les reconnaisse. Il s'agit d'un extrait de code qui peut être utilisé dans un script de génération CI.

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

Le trousseau doit être déverrouillé et l'outil "/ usr/bin/codesign" doit être autorisé à accéder à la clé privée associée à l'identité de signature pour que cela fonctionne - Les références suivantes ont été utilisées https://stackoverflow.com/ a/21327591/2351246 et Ajouter codesign à la clé privée ACL sans troussea pour déverrouiller et ajouter l'accès au trousseau pour codesign respectivement.

Si l'archive doit être ensuite exportée vers un IPA à l'aide de xcodebuild, le problème suivant doit être pris en compte ( xcodebuild ne copie pas le fichier à partir de .app ). Le profil d'approvisionnement doit être à nouveau fourni. L'extrait de script pour créer un IPA est

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"

Le trousseau devra être déverrouillé pendant l'exécution de cette commande.

MISE À JOUR

Sur OSX Mavericks (v10.9.5) et OSX Yosemite, nous avons commencé à voir des erreurs de signature de code:

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

Vérifiez cette publication ici pour la cause xcodebuild - codesign -vvvv dit que "l'enveloppe des ressources est obsolète"

Pour implémenter la modification suggérée par Apple Support dans le post référencé, exécutez la commande suivante:

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

Je me rends compte que c'est probablement un peu hors sujet OP, mais cette question se pose d'abord lorsque vous cherchez comment faire fonctionner les builds Xcode sur Jenkins. Poster quelques informations supplémentaires ici pour la postérité. Et des points. Si vous avez trouvé cela utile, veuillez donner des points :)

Quoi qu'il en soit, j'ai fait plusieurs tours sur celui-ci plusieurs fois récemment. Trouvé ceci:

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

Semble fonctionner. Assurez-vous de:

  1. Configurez d'abord la génération Xcode en tant qu'utilisateur OSX normal; faites-le construire votre distribuable à partir de là, en résolvant tout problème de profil d'approvisionnement via Xcode;

  2. Obtenez la construction de la ligne de commande en utilisant xcodebuild, en tant qu'utilisateur OSX normal;

  3. Suivez ensuite à la lettre les instructions de la publication ci-dessus, en copiant tous les certificats iOS du trousseau de connexion vers le système et en copiant ~/Library/MobileDevice/Provisioning Profiles à l'utilisateur Jenkins ~jenkins/Library/MobileDevice/Provisioning Profiles dossier.

La prochaine génération de Jenkins, en utilisant les commandes de l'étape 2 ci-dessus, devrait fonctionner parfaitement.

4
Tim Fulmer