web-dev-qa-db-fra.com

Xcode "Build and Archive" à partir de la ligne de commande

Xcode 3.2 fournit une nouvelle fonctionnalité impressionnante dans le menu Générer, "Construire et archiver", qui génère un fichier .ipa adapté à la distribution ad hoc. Vous pouvez également ouvrir l’organisateur, aller à «Applications archivées» et «Soumettre une application à iTunesConnect».

Existe-t-il un moyen d'utiliser "Construire et archiver" à partir de la ligne de commande (dans le cadre d'un script de génération)? Je suppose que xcodebuild serait impliqué d'une manière ou d'une autre, mais la page man ne semble rien dire à ce sujet.

UPDATEMichael Grinich demande des éclaircissements. voici ce que vous ne pouvez pas faire avec les versions en ligne de commande, fonctions que vous ne pouvez faire qu'avec l'organiseur de Xcode après la création et l'archivage.

  1. Vous pouvez cliquer sur "Partager l'application ..." pour partager votre IPA avec les bêta-testeurs. Comme Guillaume le souligne ci-dessous, en raison de la magie de Xcode, ce fichier IPA ne nécessite pas de fichier .mobileprovision distribué séparément que les bêta-testeurs doivent installer; c'est magique. Aucun script en 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 d'une version, vous pouvez cliquer sur "Soumettre une application à iTunes Connect" pour soumettre cette même version EXACT à Apple, le binaire que vous avez testé, sans la reconstruire. C'est impossible à partir de la ligne de commande, car la signature de l'application fait partie du processus de construction. vous pouvez signer des bits pour les tests bêta ad hoc OR, vous pouvez les signer pour les soumettre à l'App Store, mais pas les deux. Aucune IPA construite sur la ligne de commande ne peut être testée en version bêta sur des téléphones, puis soumise directement à Apple.

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

361
Dan Fabulich

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

La commande que vous devez 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.

304
vdaubry

Avec Xcode 4.2, vous pouvez utiliser le drapeau -scheme pour faire ceci:

xcodebuild -scheme <SchemeName> archive

Après cette commande, l’Archive apparaîtra dans l’organisateur Xcode.

270
Reid Ellis

Mise à jour de ma réponse avec Xcode 9 et Swift

Archive

xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchive

IPA Export (notez la pliste des options d'exportation)

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

Pour ceux qui ne connaissent pas exportOptions.plist, https://blog.bitrise.io/new-export-options-plist-in-xcode-9


Ceux qui l'utilisaient pour construire des projets dans des outils de CI/CD tels que teamcity/jenkins, assurez-vous d'utiliser le bon xcode installé dans l'agent de génération, à la fois pour l'archivage et l'exportation.

Vous pouvez utiliser l'une des deux options ci-dessous pour cela. 

  1. Utilisez le chemin complet vers xcodebuild, 

/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild

  1. Utilisez xcode-select,

xcode-select -switch /Applications/Xcode 9.3.1.app


Ci-dessous l'ancienne réponse

Voici un script en ligne de commande permettant de créer des archives et un exemple IPA . J'ai un projet iPhone xcode situé dans le dossier Desktop/MyiOSApp.

Exécutez les commandes suivantes une à 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 Distribution Profile"

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

119
Raj

J'utilise mon propre script de génération pour générer le paquet ipa destiné à la distribution ad hoc.

die() {
    echo "$*" >&2
    exit 1
}

appname='AppName'
config='Ad Hoc Distribution'
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 vous n'en avez pas besoin. J'espère que ça aide.

27
Arrix

Nous avons développé une application iPad avec XCode 4.2.1 et souhaitions l'intégrer à notre intégration continue (Jenkins) pour la distribution en direct. Voici la solution que j'ai trouvée:

# Unlock keychain
security unlock-keychain -p jenkins /Users/jenkins/Library/Keychains/login.keychain

# Build and sign app
xcodebuild -configuration Distribution clean build

# Set variables
APP_PATH="$PWD/build/Distribution-iphoneos/iPadApp.app"
VERSION=`defaults read $APP_PATH/Info CFBundleShortVersionString`
REVISION=`defaults read $APP_PATH/Info CFBundleVersion`
DATE=`date +"%Y%m%d-%H%M%S"`
iTunes_LINK="<a href=\"itms-services:\/\/?action=download-manifest\&url=https:\/\/xxx.xxx.xxx\/iPadApp-$VERSION.$REVISION-$DATE.plist\">Download iPad2-App v$VERSION.$REVISION-$DATE<\/a>"

# Package and verify app
xcrun -sdk iphoneos PackageApplication -v build/Distribution-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/\(<h3>Aktuelle Version<\/h3>\)\(.*\)\(<h3>&Auml;ltere Versionen<\/h3>.<ul>.<li>\)/\1\
${iTunes_LINK}\
\3\2<\/li>\
<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:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>items</key>
    <array>
        <dict>
            <key>assets</key>
            <array>
                <dict>
                    <key>kind</key>
                    <string>software-package</string>
                    <key>url</key>
                    <string>https://xxx.xxx.xxx/iPadApp-${VERSION}.${REVISION}-${DATE}.ipa</string>
                </dict>
                <dict>
                    <key>kind</key>
                    <string>full-size-image</string>
                    <key>needs-shine</key>
                    <true/>
                    <key>url</key>
                    <string>https://xxx.xxx.xxx/iPadApp.png</string>
                </dict>
                <dict>
                    <key>kind</key>
                    <string>display-image</string>
                    <key>needs-shine</key>
                    <true/>
                    <key>url</key>
                    <string>https://xxx.xxx.xxx/iPadApp_sm.png</string>
                </dict>
            </array>
            <key>metadata</key>
            <dict>
                <key>bundle-identifier</key>
                <string>xxx.xxx.xxx.iPadApp</string>
                <key>bundle-version</key>
                <string>${VERSION}</string>
                <key>kind</key>
                <string>software</string>
                <key>subtitle</key>
                <string>iPad2-App</string>
                <key>title</key>
                <string>iPadApp</string>
            </dict>
        </dict>
    </array>
</dict>
</plist>

Pour ce faire, vous devez importer le certificat de distribution et le profil d'approvisionnement dans le trousseau de l'utilisateur désigné.

24
FuePi

L'outil xcodebuild peut créer et exporter des produits d'archivage avec -exportArchive flag (à partir de Xcode 5). L'étape d'exportation était auparavant uniquement possible via l'interface utilisateur de Xcode Organizer.

Commencez par archiver votre application:

xcodebuild -scheme <scheme name> archive

Étant donné $ARCHIVE_PATH (le chemin d'accès au fichier .xcarchive ), exportez l'application à partir de l'archive avec l'un des éléments suivants:

iOS .ipa fichier:

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

Mac .app fichier:

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 d'approvisionnement de la version iOS spécifiait un profil d'approvisionnement de distribution AdHoc et l'identité de signature de l'application Mac spécifiait un ID développeur pour l'exportation en tant qu'application tierce (non distribuée via le Mac App Store).

23
Nik

J'ai trouvé certaines des autres réponses difficiles à faire. Cet article a fait si pour moi. Certains chemins peuvent avoir besoin d'ê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 Distribution: My Company" \
    --embed "/path/to/something.mobileprovision"
16
zekel

Vous POUVEZ réellement démissionner, tout comme XCode, pour pouvoir tester et envoyer le même fichier binaire. Par exemple, dans mon script (similaire à ceux ci-dessus), je construis ma version de version sous la forme d'une génération AdHoc, puis je l'archive sous forme d'IPA à des fins de test, puis je démissionne avec mon certificat de distribution et crée un fichier Zip, ce à quoi j'envoie Pomme. La ligne pertinente est:

codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
15
Duane Fields

J'ai donné une brève description des étapes à suivre et des paramètres à transmettre lors de la génération d'un ipa à l'aide de terrminal ci-dessous:

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

  2. En utilisant la commande 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 devrez 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 crée le projet et crée un fichier .app. Le chemin pour localiser le fichier .app est ./build/Release-iphoneos/MyApp.app.

  5. Une fois la construction réussie, exécutez la commande suivante pour générer le fichier .ipa de l'application à l'aide du nom de développeur et du profil d'approvisionnement en utilisant la syntaxe ci-dessous:

    /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} "
14
Teja Swaroop

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 les archives.

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

Étape 1 , changez de répertoire dans le dossier contenant le fichier .xcodeproject ou .xcworkspace.

cd MyProjectFolder

Étape 2 , utilisez Xcode ou /usr/libexec/PlistBuddy exportOptions.plist pour créer le fichier de liste d’options d’exportation. Au fait, xcrun xcodebuild -help vous dira quelles clés vous devez insérer dans le fichier plist.

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

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

Étape 4 , exportez en tant que fichier .ipa comme celui-ci, qui diffère de Xcode6

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

Maintenant, vous obtenez un fichier ipa dans build/directory. Envoyez-le simplement à Apple App Store.

À propos, le fichier ipa créé par Xcode 7 est beaucoup plus volumineux que par Xcode 6.

14
DawnSong

Xcode 8:


Format IPA:

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

Exporte l’archive MyMobileApp.xcarchive en tant que fichier IPA vers le chemin MyMobileApp.ipa à l’aide du fichier profil d'approvisionnement Profil de distribution MyMobileApp.

APP Format:

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'application d'application cation signature identity ID de développeur Application: Mon équipe. Identité de signature de l'installateur ID de développeur: Mon équipe est implicitement utilisée pour signer le package exporté.

Page de manuel de Xcodebuild

8
Suhaib

Allez dans le dossier où se trouve la racine de votre projet et:

xcodebuild -project projectname -activetarget -activeconfiguration archive
6
erick2red

Pour aller encore plus loin, téléchargez sur iTunesConnect via la ligne de commande avec Xcode 7! (En supposant que vous commenciez 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ée profondément dans la structure de Xcode.app, est une fonction pratique permettant de télécharger directement vers ItunesConnect.

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

Il vous suffit d'exécuter $ altool --upload-app -f file -u username [-p password] pour télécharger votre .ipa nouvellement créé directement vers Apple . Le mot de passe est facultatif et vous le demandera si vous ne l'utilisez pas. 

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 voulez 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, vous pouvez suivre la suggestion de cette SO réponse pour exécuter un lien symbolique au bon emplacement:

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

Pour améliorer 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 sœur de la commande xcodebuild, mais pour l’archivage.

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


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 des pannes que vous pourriez recevoir plus tard.

3
Guillaume

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

2
Maxim Kholyavkin

essayez xctool, c’est un remplacement du xcodebuild d’Apple qui facilite la création et le test de produits iOS et Mac. C'est particulièrement utile pour l'intégration continue. 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. Une sortie aux couleurs ANSI conviviale pour les humains.

No.3 est extrêmement utile. Je ne sais pas si quelqu'un peut lire la sortie console de xcodebuild, je ne le peux pas, elle m'a généralement donné une ligne avec plus de 5000 caractères Encore plus difficile à lire qu'une thèse.

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

2
Zitao Xiong

Après la mise à jour vers Xcode 8, j’ai constaté que l’entreprise ipa générait 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 à cause d'un problème de signature. Le journal indique que "warning: PackageApplication est obsolète, utilisez plutôt xcodebuild -exportArchive.

Je passe donc à xcodebuild -exportArchive et tout est rentré dans l'ordre.

2
Bruce Chen

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

Avec un peu d'intelligence, je parie que vous pourriez créer un script pour le faire à votre place. On dirait qu'ils sont juste stockés dans ~/Library/MobileDevice/Archived Applications/ avec un UUDI et un plist. Je ne peux pas imaginer qu'il serait aussi difficile de procéder à l'ingénierie inverse du validateur.

Le processus qui m'intéresse automatise l'envoi de versions à des bêta-testeurs. (La soumission sur l'App Store étant peu fréquente, cela ne me dérange pas de le faire manuellement, surtout que j'ai souvent besoin d'ajouter un nouveau texte de description.) En faisant un pseudo Build + Archive en utilisant la CLI de Xcode, je peux déclencher des builds automatiques à partir de chaque commit de code créer des fichiers IPA avec des profils d'approvisionnement intégrés et les envoyer par courrier électronique aux testeurs.

1
Michael Grinich

Comment construire un projet iOS avec la commande?  

Clean : codebuild clean -workspace work-space-name.xcworkspace -scheme scheme-name 

&& 

Archive : xcodebuild archive -workspace work-space-name.xcworkspace -scheme "scheme-name" -configuration Release -archivePath IPA-name.xcarchive 

&& 

Export : xcodebuild -exportArchive -archivePath IPA-name.xcarchive -exportPath IPA-name.ipa -exportOptionsPlist exportOptions.plist


Qu'est-ce que ExportOptions.plist?

ExportOptions.plist est requis dans Xcode. Il vous permet de spécifier certaines options lorsque vous créez un fichier ipa. Vous pouvez sélectionner les options dans une interface utilisateur conviviale lorsque vous utilisez Xcode pour archiver votre application. 

Important : La méthode de publication et de développement est différente dans ExportOptions.plist 

Magasin d'applications :  

exportOptions_release ~ method = app-store 

Développement  

exportOptions_dev ~ method = development

0