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.
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.
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.
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.
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.
/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild
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.
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.
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>Ä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é.
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).
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"
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"
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:
Accédez au dossier contenant le fichier MyApp.xcodeproject dans le terminal.
En utilisant la commande ci-dessous, vous obtiendrez toutes les cibles de l'application.
/usr/bin/xcodebuild -list
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
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
.
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”)
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.
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é.
Allez dans le dossier où se trouve la racine de votre projet et:
xcodebuild -project projectname -activetarget -activeconfiguration archive
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
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.
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}"
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:
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.
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.
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.
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