Xcode «Build and Archive» à partir de la ligne de commande

Xcode 3.2 fournit une nouvelle fonctionnalité impressionnante dans le menu Build, “Build and Archive”, qui génère un fichier .ipa adapté à la dissortingbution Ad Hoc. Vous pouvez également ouvrir l’Organiseur, aller dans “Applications archivées” et “Soumettre une application à iTunesConnect”.

Est-il possible d’utiliser “Build and Archive” à partir de la ligne de commande (dans le cadre d’un script de compilation)? Je suppose que xcodebuild serait impliqué d’une manière ou d’une autre, mais la page de manuel ne semble pas en parler.

MISE À JOUR Michael Grinich a demandé des éclaircissements; voici ce que vous ne pouvez pas faire avec les versions en ligne de commande, des fonctions que vous pouvez UNIQUEMENT utiliser avec l’organiseur de Xcode après avoir “construit et archivé”.

  1. Vous pouvez cliquer sur “Partager l’application …” pour partager votre IPA avec les bêta-testeurs. Comme le souligne Guillaume ci-dessous, en raison de la magie de Xcode, ce fichier IPA ne nécessite pas de fichier .mobileprovision dissortingbué séparément que les bêta-testeurs doivent installer; c’est magique. Aucun script de ligne de commande ne peut le faire. Par exemple, le script d’Arrix (soumis le 1er mai) ne répond pas à cette exigence.
  2. Plus important encore, après avoir testé une version bêta, vous pouvez cliquer sur “Soumettre l’application à iTunes Connect” pour soumettre cette même version EXACT à Apple, le binary que vous avez testé, sans le reconstruire. C’est impossible à partir de la ligne de commande, car la signature de l’application fait partie du processus de génération; vous pouvez signer des bits pour le test bêta Ad Hoc OU vous pouvez les signer pour les soumettre à l’App Store, mais pas aux deux. Aucun IPA construit sur la ligne de commande ne peut être testé sur des téléphones et soumis directement à Apple.

J’aimerais que quelqu’un vienne me prouver le contraire: ces deux fonctionnalités fonctionnent parfaitement dans l’interface graphique de Xcode et ne peuvent pas être répliquées à partir de la ligne de commande.

J’ai trouvé comment automatiser le processus de création et d’archivage à partir de la ligne de commande, je viens d’écrire un article de blog expliquant comment y parvenir.

La commande à utiliser est xcrun :

 /usr/bin/xcrun -sdk iphoneos PackageApplication \ -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" \ -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" \ --sign "${DEVELOPER_NAME}" \ --embed "${PROVISONING_PROFILE}" 

Vous trouverez tous les détails dans l’article . Si vous avez des questions, n’hésitez pas à demander.

Avec Xcode 4.2, vous pouvez utiliser l’indicateur -scheme pour faire ceci:

 xcodebuild -scheme  archive 

Après cette commande, l’archive apparaîtra dans l’organiseur Xcode.

Mettre à jour ma réponse avec Xcode 9 et Swift

Archiver

 xcodebuild -workspace /.xcworkspace -scheme  clean archive -configuration release -sdk iphoneos -archivePath .xcarchive 

IPA Export ( veuillez noter la liste d’options d’exportation )

 xcodebuild -exportArchive -archivePath .xcarchive -exportOptionsPlist /exportOptions.plist -exportPath .ipa 

Ci-dessous l’ancienne réponse

Voici un script de ligne de commande pour créer un exemple d’archive et d’IPA. J’ai un projet iPhone xcode, qui se trouve dans le dossier Desktop / MyiOSApp.

Exécuter les commandes suivantes une par une.

 cd /Users/username/Desktop/MyiOSApp/ xcodebuild -scheme MyiOSApp archive \ -archivePath /Users/username/Desktop/MyiOSApp.xcarchive xcodebuild -exportArchive -exportFormat ipa \ -archivePath "/Users/username/Desktop/MyiOSApp.xcarchive" \ -exportPath "/Users/username/Desktop/MyiOSApp.ipa" \ -exportProvisioningProfile "MyCompany Dissortingbution Profile" 

Ceci est testé avec Xcode 5 et fonctionne bien pour moi.

J’ai utilisé mon propre script de génération pour générer le package ipa pour une dissortingbution ad hoc.

 die() { echo "$*" >&2 exit 1 } appname='AppName' config='Ad Hoc Dissortingbution' sdk='iphoneos3.1.3' project_dir=$(pwd) echo using configuration $config echo updating version number agvtool bump -all fullversion="$(agvtool mvers -terse1)($(agvtool vers -terse))" echo building version $fullversion xcodebuild -activetarget -configuration "$config" -sdk $sdk build || die "build failed" echo making ipa... # packaging cd build/"$config"-iphoneos || die "no such directory" rm -rf Payload rm -f "$appname".*.ipa mkdir Payload cp -Rp "$appname.app" Payload/ if [ -f "$project_dir"/iTunesArtwork ] ; then cp -f "$project_dir"/iTunesArtwork Payload/iTunesArtwork fi ipaname="$appname.$fullversion.$(date -u +%Y%m%d%H%M%S).ipa" zip -r $ipaname Payload echo finished making $ipaname 

Le script incrémente également le numéro de version. Vous pouvez supprimer cette partie si elle n’est pas nécessaire. J’espère que cela aide.

Nous avons développé une application iPad avec XCode 4.2.1 et souhaitons intégrer le build dans notre continuous integration (Jenkins) pour la dissortingbution OTA. Voici la solution que j’ai proposée:

 # Unlock keychain security unlock-keychain -p jenkins /Users/jenkins/Library/Keychains/login.keychain # Build and sign app xcodebuild -configuration Dissortingbution clean build # Set variables APP_PATH="$PWD/build/Dissortingbution-iphoneos/iPadApp.app" VERSION=`defaults read $APP_PATH/Info CFBundleShortVersionSsortingng` REVISION=`defaults read $APP_PATH/Info CFBundleVersion` DATE=`date +"%Y%m%d-%H%M%S"` ITUNES_LINK="Download iPad2-App v$VERSION.$REVISION-$DATE<\/a>" # Package and verify app xcrun -sdk iphoneos PackageApplication -v build/Dissortingbution-iphoneos/iPadApp.app -o $PWD/iPadApp-$VERSION.$REVISION-$DATE.ipa # Create plist cat iPadApp.plist.template | sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATE}/$DATE/" -e "s/\${REVISION}/$REVISION/" > iPadApp-$VERSION.$REVISION-$DATE.plist # Update index.html curl https://xxx.xxx.xxx/index.html -o index.html.$DATE cat index.html.$DATE | sed -n '1h;1!H;${;g;s/\(

Aktuelle Version<\/h3>\)\(.*\)\(

Ältere Versionen<\/h3>.
    .
  • \)/\1\ ${ITUNES_LINK}\ \3\2<\/li>\
  • /g;p;}' | sed -e "s/\${ITUNES_LINK}/$ITUNES_LINK/" > index.html

Ensuite, Jenkins télécharge les fichiers ipa, plist et html sur notre serveur Web.

Voici le modèle de plist:

     items   assets   kind software-package url https://xxx.xxx.xxx/iPadApp-${VERSION}.${REVISION}-${DATE}.ipa   kind full-size-image needs-shine  url https://xxx.xxx.xxx/iPadApp.png   kind display-image needs-shine  url https://xxx.xxx.xxx/iPadApp_sm.png   metadata  bundle-identifier xxx.xxx.xxx.iPadApp bundle-version ${VERSION} kind software subtitle iPad2-App title iPadApp      

Pour ce faire, vous devez importer le certificate de dissortingbution et le profil d’approvisionnement dans le trousseau de l’utilisateur désigné.

L’outil xcodebuild peut créer et exporter des produits d’archive avec l’indicateur -exportArchive (à partir de Xcode 5). L’étape d’exportation n’était auparavant possible que via l’interface utilisateur de Xcode Organizer.

Commencez par archiver votre application:

 xcodebuild -scheme  archive 

Étant donné $ARCHIVE_PATH (le chemin d’access au fichier .xcarchive ), exportez l’application depuis l’archive avec l’un des éléments suivants:

Fichier iOS .ipa :

 xcodebuild -exportArchive -exportFormat ipa -archivePath "$ARCHIVE_PATH" -exportPath "myApp.ipa" -exportProvisioningProfile "My App Provisioning profile" 

Fichier Mac .app :

 xcodebuild -exportArchive -exportFormat app -archivePath "$ARCHIVE_PATH" -exportPath "myApp.app" -exportSigningIdentity "Developer ID Application: My Software Company" 

Dans les deux commandes, les arguments -exportProvisioningProfile et -exportSigningIdentity sont facultatifs. man xcodebuild pour plus de détails sur la sémantique. Dans ces exemples, le profil de configuration pour la génération iOS spécifiait un profil de configuration de dissortingbution AdHoc et l’identité de signature pour l’application Mac spécifiait un ID de développeur pour l’exportation en tant qu’application tierce (c’est-à-dire non dissortingbué via le Mac App Store).

J’ai trouvé certaines des autres réponses difficiles à trouver. Cet article a fait si pour moi. Certains chemins doivent être absolus, comme mentionné dans les autres réponses.

La commande:

 xcrun -sdk iphoneos PackageApplication \ "/path/to/build/MyApp.app" \ -o "output/path/to/MyApp.ipa" \ --sign "iPhone Dissortingbution: My Company" \ --embed "/path/to/something.mobileprovision" 

Vous POUVEZ réellement renoncer à une génération, tout comme XCode, afin de pouvoir tester et expédier le même fichier binary. Par exemple, dans mon script (similaire à ceux ci-dessus), je construis ma version signée en tant que version AdHoc, puis je l’archive en tant qu’IPA pour le tester, puis me résigne avec mon certificate de dissortingbution et crée un fichier zip. Pomme. La ligne pertinente est:

 codesign -f -vv -s "$DissortingbutionIdentity" "$APPDIR" 

Pour Xcode 7 , vous avez une solution beaucoup plus simple. Le seul travail supplémentaire est que vous devez créer un fichier plist de configuration pour exporter l’archive.

(Comparé à Xcode 6, dans les résultats de xcrun xcodebuild -help , les options -exportFormat et -exportProvisioningProfile ne sont plus mentionnées; la première est supprimée et la dernière est remplacée par -exportOptionsPlist .)

Étape 1 , changez de répertoire vers le dossier, y compris le fichier .xcodeproject ou .xcworkspace.

 cd MyProjectFolder 

Étape 2 , utilisez Xcode ou /usr/libexec/PlistBuddy exportOptions.plist pour créer un fichier plist d’options d’exportation. Par ailleurs, xcrun xcodebuild -help vous indiquera les clés à insérer dans le fichier plist.

Étape 3 , créez le fichier .xcarchive (dossier, en fait) comme suit (le répertoire build / sera automatiquement créé par Xcode dès maintenant),

 xcrun xcodebuild -scheme MyApp -configuration Release archive -archivePath build/MyApp.xcarchive 

Etape 4 , exportez en fichier .ipa comme celui-ci, différent de Xcode6

 xcrun xcodebuild -exportArchive -exportPath build/ -archivePath build/MyApp.xcarchive/ -exportOptionsPlist exportOptions.plist 

Maintenant, vous obtenez un fichier ipa dans build / directory. Il suffit de l’envoyer à Apple App Store.

Par ailleurs, le fichier ipa créé par Xcode 7 est beaucoup plus volumineux que celui de Xcode 6.

J’ai donné une brève description des étapes à suivre et des parameters à passer lors de la génération d’un ipa en utilisant terrminal ci-dessous:

  1. Accédez au dossier contenant le fichier MyApp.xcodeproject dans le terminal

  2. En utilisant la commande donnée ci-dessous, vous obtiendrez toutes les cibles de l’application

     /usr/bin/xcodebuild -list 
  3. Une fois la commande ci-dessus exécutée, vous obtiendrez une liste de cibles parmi lesquelles vous devez sélectionner une cible spécifique dont vous avez besoin pour générer .ipa.

     /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release 
  4. La commande ci-dessus génère le projet et crée un fichier .app. Le chemin d’access pour localiser le fichier .app est ./build/Release-iphoneos/MyApp.app

  5. Une fois que Build est réussi, exécutez la commande suivante pour générer .ipa de l’application à l’aide du nom du développeur et du profil d’approvisionnement en utilisant la syntaxe suivante:

     /usr/bin/xcrun -sdk iphoneos PackageApplication -v “${TARGET}.app” -o “${OUTDIR}/${TARGET}.ipa” –sign “${IDENTITY}” –embed “${PROVISONING_PROFILE}” 

Explication de chaque paramètre dans la syntaxe ci-dessus:

 ${TARGET}.app == Target path (ex :/Users/XXXXXX/desktop/Application/build/Release-iphoneos/MyApp.app) ${OUTDIR} == Select the output directory(Where you want to save .ipa file) ${IDENTITY} == iPhone Developer: XXXXXXX (XXXXXXXXXX)(which can be obtained from Keychain access) ${PROVISONING_PROFILE} == Path to the provisioning profile(/Users/XXXXXX/Library/MobileDevice/Provisioning Profiles/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.mobileprovision”) 
  1. ipa sera généré dans le répertoire de sortie sélectionné ” $ {OUTDIR}

Xcode 8:


Format IPA:

 xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Dissortingbution Profile' 

Exporte l’archive MyMobileApp.xcarchive en tant que fichier IPA dans le chemin MyMobileApp.ipa à l’aide du profil de dissortingbution MyMobileApp Profile.

Format APP:

 xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team' 

Exporte l’archive MyMacApp.xcarchive en tant que fichier PKG vers le chemin MyMacApp.pkg à l’aide de l’identité de signature de l’application d’application cation ID de développeur Application: My Team. Identité de signature du programme d’installation Developer ID Installer: Mon équipe est implicitement utilisée pour signer le package exporté.

Page de manuel de Xcodebuild

Allez dans le dossier où est votre projet racine et:

 xcodebuild -project projectname -activetarget -activeconfiguration archive 

Aller plus loin, télécharger sur iTunesConnect via la ligne de commande avec Xcode 7 ! (En supposant que vous commencez avec un .ipa qui a été signé avec le profil de version et l’identité de signature corrects.)

Entrez altool , l’interface CLI pour Application Loader ( docs , page 38). Caché au plus profond de la structure de Xcode.app, une fonction pratique nous permet de télécharger directement sur ItunesConnect.

 /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool 

Il suffit de lancer $ altool --upload-app -f file -u username [-p password] pour télécharger votre .ipa nouvellement .ipa directement sur Apple. Le mot de passe est facultatif et vous le demandera si vous le laissez de la commande.

S’il y a des problèmes avec l’application pendant l’étape de vérification, la console les imprimera.

Vous devrez probablement exporter le chemin vers altool si vous ne souhaitez pas enregistrer son emplacement.

 export PATH=$PATH:/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/ 

C’est tout! Connectez-vous simplement à iTunesConnect.com et sélectionnez votre nouvelle version à tester avec Testflight.

Note finale: Si vous obtenez une erreur en indiquant Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application , vous pouvez suivre la suggestion sur cette réponse SO , pour exécuter un lien symbolique vers l’emplacement correct:

 ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms 

En améliorant la réponse de Vincent, j’ai écrit un script pour le faire: xcodearchive
Il vous permet d’archiver (générer un ipa) votre projet via la ligne de commande. Pensez-y comme la soeur de la commande xcodebuild , mais pour l’archivage.

Le code est disponible sur github: http://github.com/gcerquant/xcodearchive

L’une des options du script consiste à activer l’archivage des symboles dSYM dans une archive horodatée. Aucune excuse pour ne plus conserver les symboles, et ne pas pouvoir symboliser le journal de bord que vous pourriez recevoir plus tard.

essayez xctool, il remplace le xcodebuild d’Apple qui facilite la construction et le test des produits iOS et Mac. C’est particulièrement utile pour l’continuous integration. Il a quelques fonctionnalités supplémentaires:

  1. Exécute les mêmes tests que Xcode.app.
  2. Sortie structurée des résultats de construction et de test.
  3. Sortie humaine, colorée ANSI.

No.3 est extrêmement utile. Je ne sais pas si quelqu’un peut lire la sortie de console de xcodebuild, je ne peux pas, en général cela me donnait une ligne avec 5000+ caractères. Encore plus difficile à lire qu’un article de thèse.

xctool: https://github.com/facebook/xctool

si vous utilisez l’outil suivant: https://github.com/nomad/shenzhen

alors cette tâche est très facile:

 which ipa 1>/dev/null 2>&1 || echo 'no shenzhen. to install use: sudo gem install shenzhen --no-ri --no-rdoc' ipa build --verbose --scheme "${schemeName}" 

la source

Après la mise à jour vers Xcode 8, j’ai constaté que l’entreprise ipa génère par

 /usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}" 

La commande ne peut pas être lancée en raison d’un problème de signature. Le journal indique que “warning: PackageApplication est obsolète, utilisez xcodebuild -exportArchive .

Donc, je passe à xcodebuild -exportArchive et tout est rentré dans l’ordre.

Vous voulez dire les options valider / partager / soumettre? Je pense que ceux-ci sont spécifiques à Xcode et ne conviennent pas à un outil de génération de ligne de commande.

Avec un peu d’intelligence, je parie que vous pourriez faire un script pour le faire pour vous. Il semble qu’ils soient simplement stockés dans ~/Library/MobileDevice/Archived Applications/ avec un UUDI et un plist. Je ne peux pas imaginer que ce serait aussi difficile de désosser le validateur non plus.

Le processus que je souhaite automatiser envoie des compilations aux bêta-testeurs. (Étant donné que la soumission App Store se produit rarement, cela ne me dérange pas de le faire manuellement, d’autant plus que je dois souvent append un nouveau texte de description.) En construisant un pseudo Build + Archive à l’aide de l’interface CLI de Xcode, Créez des fichiers IPA avec des profils de provisionnement intégrés et envoyez-les par courrier électronique aux testeurs.