Xcode "construire et archiver" à partir de la ligne de commande

Xcode 3.2 fournit une nouvelle fonctionnalité impressionnante sous le menu de construction, "Construire et archiver" qui génère un .fichier ipa adapté à une distribution Ad Hoc. Vous pouvez également ouvrir L'Organisateur, aller à "Demandes archivées", et "soumettre la demande à iTunesConnect."

y a-t-il un moyen d'utiliser" construire et archiver " depuis la ligne de commande (dans le cadre d'un script de construction)? Je suppose que xcodebuild serait impliqué d'une façon ou d'une autre, mais la page man ne semble pas dire rien à ce sujet.

mise à jour Michael Grinich a demandé des éclaircissements; voici ce que vous ne pouvez pas faire exactement avec les constructions en ligne de commande, les fonctionnalités que vous pouvez faire seulement avec L'organisateur de Xcode après vous" construire et archiver."

  1. vous pouvez cliquer sur " Application de partage..."pour partager votre IPA avec les bêta-testeurs. Comme le souligne Guillaume ci-dessous, en raison d'une certaine magie Xcode, ce fichier IPA ne nécessite pas de distribution séparée .mobileprovision fichier que les testeurs bêta ont besoin d'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 satisfait pas à cette exigence.
  2. plus important encore, après avoir testé une construction, vous pouvez cliquer sur" soumettre une Application à iTunes Connect " pour soumettre la même construction exacte à Apple, le binaire que vous avez testé, sans la reconstruire. C'est impossible à partir de la ligne de commande, parce que signer l'application fait partie de la construction processus; vous pouvez signer bits for Ad Hoc beta testing ou vous pouvez les signer pour la soumission à L'App Store, mais pas les deux. Aucun IPA construit sur la ligne de commande peut être bêta testé sur les téléphones et ensuite soumis directement à Apple.

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

353
demandé sur Dan Fabulich 2010-04-19 06:18:34

18 réponses

j'ai trouvé comment automatiser le processus de construction et d'archivage à partir de la ligne comand, je viens d'écrire un article de blog expliquant comment vous pouvez atteindre cela.

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.

302
répondu vdaubry 2018-08-27 21:29:43

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.

267
répondu Reid Ellis 2011-12-21 13:13:20

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

de l'IAP à l'Exportation ( veuillez noter que l'option d'exportation plist )

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

pour ceux qui ne connaissent pas les options d'exportation.plist, https://blog.bitrise.io/new-export-options-plist-in-xcode-9


ceux qui l'utilisaient pour le projet de construction dans les outils CI/CD comme teamcity/jenkins, s'il vous plaît assurez-vous que vous utilisez le xcode droit installé dans l'agent de construction pour à la fois pour l'archive et l'exportation.

vous pouvez utiliser l'une des 2 options ci-dessous pour cela.

  1. utilisez le chemin complet vers xcodebuild,

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

  1. Utiliser xcode-select,

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


ci-dessous est une ancienne réponse

voici le script en ligne de commande pour créer des archives et un exemple IPA. J'ai un projet iPhone xcode , qui se trouve dans le dossier Desktop/MyiOSApp.

exécute 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 Distribution Profile"

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

111
répondu Raj 2018-09-10 00:50:46

j'ai utilisé mon propre script de construction pour générer le paquet ipa pour une 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 aussi le numéro de version. Vous pouvez enlever cette partie si elle n'est pas nécessaire. Espérons que cela aide.

27
répondu Arrix 2010-05-01 09:15:00

nous avons développé une application iPad avec XCode 4.2.1 et avons voulu intégrer le build dans notre intégration continue (Jenkins) pour la distribution OTA. 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>\)/\
${ITUNES_LINK}\
<\/li>\
<li>/g;p;}' | sed -e "s/${ITUNES_LINK}/$ITUNES_LINK/" > index.html

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

c'est le modèle de la liste:

<?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 désigné de l'utilisateur d'un trousseau de clés.

24
répondu FuePi 2012-06-11 14:01:55

l'outil xcodebuild peut construire et exporter des produits d'archives avec le drapeau - exportArchive (à partir du Xcode 5). Auparavant, l'étape d'exportation n'était possible que via L'interface utilisateur Xcode.

première archive de votre application:

xcodebuild -scheme <scheme name> archive

Donné $ARCHIVE_PATH (le chemin d'accès à la .xcarchive Fichier), Exporter l'application à partir de l'archive avec l'un des 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 de provisionnement pour la construction iOS spécifiait un profil de provisionnement de distribution AdHoc, et l'identité de signature pour le Mac app a spécifié un identifiant de développeur pour l'exportation en tant qu'application tierce (c'est-à-dire non distribuée via L'App Store Mac).

21
répondu Nik 2013-11-21 21:55:26

j'ai trouvé certaines des autres réponses ici difficiles à obtenir. Cet article n'a si, pour moi. Certains chemins peuvent devoir ê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
répondu zekel 2011-12-07 14:28:57

vous pouvez en fait renoncer à une construction, tout comme XCode, de sorte que vous pouvez tester et expédier le même binaire. Par exemple, dans mon script (similaire à ceux ci-dessus), je construis ma version de publication signée AdHoc, puis je l'archive en tant qu'IPA pour tester, puis je démissionne avec mon certificat de distribution et je crée un fichier zip, ce que J'envoie à Apple. La ligne correspondante est la suivante:

codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
15
répondu Duane Fields 2011-02-13 14:55:01

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

(comparé au Xcode 6, dans les résultats des options xcrun xcodebuild -help , -exportFormat et -exportProvisioningProfile ne sont plus mentionnés; le premier est supprimé, et le second est remplacé par -exportOptionsPlist .)

Étape 1 , changer l'annuaire dossier notamment .xcodeproject ou .fichier xcworkspace.

cd MyProjectFolder

Step 2 , utilisez Xcode ou /usr/libexec/PlistBuddy exportOptions.plist pour créer le fichier export options plist. Par ailleurs, xcrun xcodebuild -help vous indiquera quelles clés vous devez insérer dans le fichier plist.

l'Étape 3 , créer .xcarchive fichier (dossier, en fait) comme suit(build/ répertoire sera créé automatiquement par Xcode),

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

Étape 4 exporter en tant que .fichier ipa comme ceci, qui diffère de Xcode6

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

Maintenant, vous obtenez un fichier ipa dans le répertoire build/. Il suffit de l'Envoyer à apple App Store.

soit dit en passant, le fichier ipa créé par Xcode 7 est beaucoup plus grand que Xcode 6.

14
répondu Dawn Song 2016-02-22 06:29:27

j'ai donné une brève description des étapes à suivre, et des paramètres à passer tout en générant un ipa en utilisant terrminal ci-dessous:

  1. allez dans le dossier qui contient la MyApp.xcodeproject fichier dans un terminal

  2. en utilisant la commande ci-dessous vous obtiendrez toutes les cibles de l'application

    /usr/bin/xcodebuild -list 
    
  3. Après la commande ci-dessus est exécuté, vous obtiendrez une liste de cibles dont vous devriez sélectionner une cible spécifique que vous devez générer .ipa

    /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
    
  4. la commande ci-dessus construit le projet et crée un .app fichier.Le chemin d'accès pour localiser le .application fichier est ./build/Release-iphoneos/MyApp.app

  5. après que Build soit réussi puis exécuter la commande suivante pour générer .ipa de l'application en utilisant le nom du développeur et le profil D'approvisionnement en utilisant le 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 seront générées à sélectionné répertoire de sortie " ${OUTDIR} "
12
répondu Teja Swaroop 2017-05-24 06:08:59

Xcode 8:


format IPA:

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

exporte l'archive MyMobileApp.xcarchive comme un fichier IPA vers le chemin MyMobileApp.l'iap à l'aide de la profil d'approvisionnement Mymobileapp profil de Distribution.

APP Format:

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

exporte l'archive MyMacApp.xcarchive comme un fichier PKG vers le chemin MyMacApp.pkg à l'aide de l'application de l'application cation signing identity Developer ID Application: Mon équipe. L'identité de signature de l'installateur Installateur de Developer ID: mon équipe est implicitement utilisée pour signer le paquet exporté.

Xcodebuild page de manuel de

8
répondu Suhaib 2016-10-05 17:13:05

allez dans le dossier où est la racine de votre projet et:

xcodebuild -project projectname -activetarget -activeconfiguration archive
6
répondu erick2red 2010-04-27 17:39:41

va un peu plus loin, en chargeant 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 mainlevée correct et l'identité de signature.)

Enter altool , l'interface CLI pour le chargeur D'Application( docs , page 38). Caché au plus profond de Xcode.structure de l'application, est une fonction pratique pour nous permettre de télécharger directement à ItunesConnect.

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

il suffit d'exécuter $ altool --upload-app -f file -u username [-p password] pour télécharger votre nouveau .ipa directement sur Apple. Le mot de passe est optionnel, et vous demandera si vous le laissez hors 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 voulez pas sauvegarder son emplacement.

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

That's it! Il vous suffit de vous connecter iTunesConnect.com et sélectionnez votre nouvelle construction pour tester avec testflight.

Note finale: si vous obtenez une erreur disant 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 this SO answer , pour exécuter un lien symbolique à l'emplacement correct:

ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms
4
répondu mix3d 2017-05-23 12:10:04

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 sœur de la commande xcodebuild , mais pour l'archivage.

Le Code

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



Une option du script est d'activer l'archivage des symboles dSYM dans une archive horodatée. Aucune excuse pour ne pas garder les symboles plus, et ne pas être en mesure de symboliser le journal de crash que vous pourriez recevoir plus tard.

3
répondu Guillaume 2011-11-17 11:47:15

essayer xctool, c'est un remplacement pour xcodebuild D'Apple qui le rend plus facile à construire et tester des produits iOS et Mac. C'est particulièrement utile pour l'intégration continue. Il a quelques caractéristiques supplémentaires:

  1. exécute les mêmes essais que Xcode.App.
  2. production structurée de résultats de construction et d'essais.
  3. Human-friendly, ANSI couleur de sortie.

N ° 3 est extrêmement utile. Je ne suis pas si n'importe qui peut lire la sortie de la console de xcodebuild, Je ne peux pas, habituellement il m'a donné une ligne avec 5000+ caractères. Encore plus difficile à lire qu'un article de thèse.

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

2
répondu Zitao Xiong 2013-05-16 21:43:08

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

source

2
répondu Speakus 2017-05-23 12:18:04

après mise à jour en Xcode 8, j'ai trouvé que l'entreprise ipa générer 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. Journal indique que "avertissement: PackageApplication est obsolète, utilisez xcodebuild -exportArchive à la place.

donc je passe à xcodebuild -exportArchive et tout est redevenu normal.

2
répondu Bruce Chen 2016-10-04 23:16:46

vous voulez dire les options valider/share/submit? Je pense que ceux-ci sont spécifiques à Xcode, et ne conviennent pas pour un outil de construction en ligne de commande.

Avec un peu d'astuce, je parie que vous pourriez faire un script pour le faire pour vous. On dirait qu'ils sont stockés dans ~/Library/MobileDevice/Archived Applications/ avec un UUDI et un plist. Je ne peux pas imaginer que ce serait difficile de le désosser le validateur.

le processus que je suis intéressé automatiser est d'envoyer des constructions aux beta testeurs. (Depuis App Store soumission se produit rarement, Je ne me dérange pas le faire manuellement, surtout que je dois souvent ajouter un nouveau texte de description.) En faisant une archive pseudo Build+en utilisant le CLI de Xcode, je peux déclencher des compilations automatiques à partir de chaque propagation de code, créer des fichiers IPA avec des profils de provisionnement intégrés, et les envoyer aux testeurs.

1
répondu Michael Grinich 2010-07-20 19:17:29