Définition d'un profil de provisionnement à l'intérieur xcodebuild lors des applications iPhone

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

Question

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

Était-ce utile?

La solution

Documentation

Il semble de la doc, vous ne pouvez pas définir le fichier de provisionnement mais vous pouvez spécifier la cible:

[- targetname cible]

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

accomplirait essentiellement ce que votre demande.

Autres conseils

En fait, vous devriez être en mesure d'ajouter simplement à la mise en ligne de commande XCode.

xcodebuild [toutes les autres options que vous avez] PROVISIONING_PROFILE = "[Votre profil ID unique ici]"

paramètres de construction de la ligne de commande sont censés remplacer tout, ce qui devrait l'emporter sur quoi que ce soit défini dans le projet ou la cible.

Ma solution est pas élégant, mais il fait le travail et laissez-moi tout automatiser 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 est que je ne l'ai pas ici besoin d'installer le profil d'approvisionnement en premier. J'ai fait un autre script qui utilise mécaniser pour télécharger la dernière copie du profil de provisionnement avant chaque génération qui nous permet de mettre à jour le profil (l'ajout de nouveaux dispositifs, par exemple) à distance et ont ces changements pris en charge par notre serveur CI sans travail supplémentaire.

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

Le profil de provisionnement doit être fournie par UUID, dans mon cas, les profils de provisionnement sont contrôlés au système de contrôle de code source, et sont donc vérifiés avec le code par le développeur / build système de serveur / 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 dossier ~ / Library / MobileDevice / répertoire de profils d'approvisionnement avant xcodebuild les reconnaîtra. Ceci est un extrait de code qui peut être utilisé dans un script de construction de 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 à ACL clé privée sans porte-clés pour déverrouiller et en ajoutant trousseau d'accès pour codesign respectivement.

Si l'archive doit être ensuite exporté vers un IPA à l'aide xcodebuild alors la question suivante doit être prise en compte ( xcodebuild pas copie du fichier de .app). Le profil de provisionnement doit être fourni à nouveau. 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 que cette commande est en cours d'exécution.

UPDATE

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

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

Vérifiez cette annonce ici pour la cause xcodebuild - codesign -vvvv dit "enveloppe de ressources est obsolète"

Pour mettre en œuvre la modification proposée par Apple Support dans le poste 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`

Je sais que cela est probablement un peu hors sujet OP, mais cette question qui revient d'abord lors de la recherche pour savoir comment obtenir Xcode builds travailler sur Jenkins. L'affichage des informations supplémentaires ici pour la postérité. Et les points. Si vous avez trouvé cela utile, s'il vous plaît donner des points:)

Quoi qu'il en soit, est allé plusieurs tours sur celui-ci ces derniers temps une ou deux fois. Trouvé ceci:

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

Semble fonctionner. Assurez-vous:

  1. Configuration du Xcode construit comme un utilisateur régulier OSX premier; l'obtenir la construction de votre distribuables à partir de là, la fixation des problèmes de profil de provisionnement par Xcode;

  2. Obtenir la ligne de commande build de travail en utilisant xcodebuild, en tant qu'utilisateur régulier OSX;

  3. Ensuite, suivez les instructions du message ci-dessus à la lettre, la copie de tous iOS certs de Connexion Keychain du système et la copie à ~/Library/MobileDevice/Provisioning Profiles dossier de ~jenkins/Library/MobileDevice/Provisioning Profiles l'utilisateur Jenkins.

La prochaine Jenkins construire, à l'aide des commandes dans l'étape 2 ci-dessus, devrait fonctionner parfaitement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top