it-swarm.com.de

Xcode "Build and Archive" von der Kommandozeile aus

Xcode 3.2 bietet im Menü "Erstellen" eine fantastische neue Funktion, "Erstellen und Archivieren", die eine .ipa-Datei generiert, die für die Ad-hoc-Verteilung geeignet ist. Sie können auch den Organizer öffnen, "Archivierte Anwendungen" und "Anwendung an iTunesConnect senden" aufrufen.

Gibt es eine Möglichkeit, "Build and Archive" über die Befehlszeile (als Teil eines Build-Skripts) zu verwenden? Ich würde davon ausgehen, dass xcodebuild irgendwie involviert ist, aber die man-Seite scheint nichts darüber zu sagen.

UPDATEMichael Grinich bat um Klarstellung; Genau das können Sie nicht mit Befehlszeilen-Builds machen. Funktionen, die Sie NUR mit Xcode Organizer nach dem Erstellen und Archivieren tun können.

  1. Sie können auf "Anwendung freigeben ..." klicken, um Ihre IPA für Betatester freizugeben. Wie Guillaume im Folgenden ausführt, erfordert diese IPA-Datei aufgrund einiger Xcode-Zauber keine separat verteilte .mobileprovision-Datei, die Betatester installieren müssen. das ist magisch. Kein Befehlszeilenskript kann das. Beispielsweise erfüllt das Skript von Arrix (eingereicht am 1. Mai) diese Anforderung nicht.
  2. Noch wichtiger ist, dass Sie nach dem Beta-Test eines Builds auf "Anwendung an iTunes Connect senden" klicken können, um den exakt gleichen Build an Apple, die von Ihnen getestete Binärdatei, zu senden, ohne ihn neu zu erstellen. Das ist von der Befehlszeile aus nicht möglich, da das Signieren der App Teil des Erstellungsprozesses ist. Sie können Bits für Ad-hoc-Beta-Tests OR signieren. Sie können sie zur Übermittlung an den App Store signieren, nicht jedoch beide. Kein auf der Befehlszeile aufgebauter IPA kann auf einem Telefon Beta-Test durchgeführt und dann direkt an Apple übermittelt werden.

Ich würde gerne jemanden mitbringen und mich als falsch beweisen: Beide Funktionen funktionieren in der Xcode-GUI hervorragend und können nicht über die Befehlszeile repliziert werden.

361
Dan Fabulich

Ich habe herausgefunden, wie man den Build- und Archivierungsprozess von der Befehlszeile aus automatisieren kann. Ich habe gerade einen Blogartikel geschrieben , der erklärt, wie man das erreichen kann.

Der Befehl, den Sie verwenden müssen, ist 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}"

Sie finden alle Details in dem Artikel . Bei Fragen zögern Sie nicht zu fragen.

304
vdaubry

Mit Xcode 4.2 können Sie dazu das Flag -scheme verwenden:

xcodebuild -scheme <SchemeName> archive

Nach diesem Befehl wird das Archiv im Xcode Organizer angezeigt.

270
Reid Ellis

Aktualisierung meiner Antwort mit Xcode 9 und Swift

Archiv

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

IPA-Export (Bitte Exportliste beachten)

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

Für diejenigen, die exportOptions.plist nicht kennen: https://blog.bitrise.io/new-export-options-plist-in-xcode-9


Diejenigen, die dies für die Erstellung von Projekten in CI/CD-Tools wie Teamcity/Jenkins verwendet haben, stellen Sie bitte sicher, dass Sie den richtigen Xcode verwenden, der im Build Agent für Archivierung und Export installiert ist.

Sie können dazu eine der beiden folgenden Optionen verwenden. 

  1. Verwenden Sie den vollständigen Pfad zu xcodebuild, 

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

  1. Xcode-select verwenden,

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


Unten ist alte Antwort

Hier ist ein Befehlszeilenskript zum Erstellen eines Archivs und eines IPA-Beispiels . Ich habe ein iPhone-Xcode-Projekt, das sich im Ordner Desktop/MyiOSApp befindet.

Führen Sie die folgenden Befehle nacheinander aus.

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"

Dies wird mit Xcode 5 getestet und funktioniert für mich einwandfrei.

119
Raj

Ich habe mein eigenes Build-Skript verwendet, um das IP-Paket für die Ad-hoc-Verteilung zu generieren.

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

Das Skript erhöht auch die Versionsnummer. Sie können das Teil entfernen, wenn es nicht benötigt wird. Ich hoffe es hilft.

27
Arrix

Wir haben eine iPad-App mit XCode 4.2.1 entwickelt und wollten den Build in unsere Continuous Integration (Jenkins) für die OTA-Distribution integrieren. Hier ist die Lösung, die ich mir ausgedacht habe:

# 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

Dann lädt Jenkins die Dateien ipa, plist und html auf unseren Webserver hoch.

Dies ist die Plist-Vorlage:

<?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>

Um dies einzurichten, müssen Sie das Verteilungszertifikat und das Bereitstellungsprofil in den Schlüsselbund des angegebenen Benutzers importieren.

24
FuePi

Das Tool xcodebuild kann Archivprodukte mit dem Flag-exexportArchive erstellen und exportieren (ab Xcode 5). Der Exportschritt war bisher nur über die Xcode Organizer-Benutzeroberfläche möglich.

Zuerst archivieren Sie Ihre App:

xcodebuild -scheme <scheme name> archive

Wenn Sie $ARCHIVE_PATH (den Pfad zur Datei .xcarchive ) angegeben haben, exportieren Sie die App mit einem der folgenden Befehle aus dem Archiv:

iOS .ipa file:

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

Mac .app -Datei:

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

In beiden Befehlen sind die Argumente -exportProvisioningProfile und -exportSigningIdentity optional. man xcodebuild für Details zur Semantik. In diesen Beispielen gab das Bereitstellungsprofil für den iOS-Build ein AdHoc-Verteilungsbereitstellungsprofil an, und die Signaturidentität für die Mac-App gab eine Entwickler-ID zum Export als Drittanbieteranwendung (d. H. Nicht über den Mac App Store verteilt) an.

23
Nik

Ich habe einige der anderen Antworten hier nur schwer gefunden. Dieser Artikel wenn für mich. Einige Pfade müssen möglicherweise absolut sein, wie in den anderen Antworten erwähnt.

Der Befehl:

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

Sie KÖNNEN tatsächlich einen Build zurückgeben, genau wie XCode, sodass Sie dieselbe Binärdatei testen und versenden können. Zum Beispiel baue ich in meinem Skript (ähnlich wie oben) eine als AdHoc-Build signierte Release-Version, archiviere sie dann als IPA zum Testen, kündige dann mein Distributionszertifikat und erstelle eine ZIP-Datei, an die ich sende Apfel. Die relevante Zeile ist:

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

Ich habe eine kurze Beschreibung der Schritte gegeben, die zu befolgen sind, und der Parameter, die beim Generieren eines ipa mit terrminal weitergegeben werden müssen:

  1. Wechseln Sie zu dem Ordner, der die MyApp.xcodeproject-Datei im Terminal enthält

  2. Wenn Sie den unten angegebenen Befehl verwenden, erhalten Sie alle Ziele der Anwendung

    /usr/bin/xcodebuild -list 
    
  3. Nachdem der obige Befehl ausgeführt wurde, erhalten Sie eine Liste von Zielen, für die Sie ein bestimmtes Ziel auswählen sollten, das Sie zum Generieren von .ipa benötigen

    /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
    
  4. Der obige Befehl erstellt das Projekt und erstellt eine .app-Datei. Der Pfad zum Auffinden der .app-Datei lautet ./build/Release-iphoneos/MyApp.app

  5. Nachdem Build erfolgreich abgeschlossen wurde, führen Sie den folgenden Befehl aus, um .ipa der Anwendung mithilfe des Entwicklernamens und des Bereitstellungsprofils mithilfe der folgenden Syntax zu generieren:

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

Erklärung jedes Parameters in der obigen Syntax:

${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 wird im ausgewählten Ausgabeverzeichnis " $ {OUTDIR} " generiert.
14
Teja Swaroop

Für Xcode 7 haben Sie eine wesentlich einfachere Lösung. Die einzige zusätzliche Arbeit ist, dass Sie eine Konfigurationsdatei für den Archivexport erstellen müssen.

(Im Vergleich zu Xcode 6 werden in den Ergebnissen von xcrun xcodebuild -help die Optionen -exportFormat und -exportProvisioningProfile nicht mehr erwähnt; die erstere wird gelöscht und die letztere wird durch -exportOptionsPlist ersetzt.)

Schritt 1 , Verzeichnis in den Ordner einschließlich .xcodeproject oder .xcworkspace-Datei wechseln.

cd MyProjectFolder

Schritt 2 , verwenden Sie Xcode oder /usr/libexec/PlistBuddy exportOptions.plist, um eine Exportoptionsplist-Datei zu erstellen. xcrun xcodebuild -help sagt Ihnen übrigens, welche Schlüssel Sie in die plist-Datei einfügen müssen.

Schritt 3 , .xcarchive-Datei (Ordner) wie folgt erstellen (build/Verzeichnis wird jetzt automatisch von Xcode erstellt),

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

Schritt 4 , Export als .ipa-Datei, die sich von Xcode6 unterscheidet

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

Sie erhalten jetzt eine ipa-Datei im Verzeichnis build /. Senden Sie es einfach an den Apple App Store.

Übrigens ist die von Xcode 7 erzeugte ipa-Datei viel größer als die von Xcode 6.

14
DawnSong

Xcode 8:


IPA-Format:

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

Exportiert das Archiv MyMobileApp.xcarchive als IPA-Datei in den Pfad MyMobileApp.ipa unter Verwendung von Bereitstellungsprofil MyMobileApp Distribution Profile.

APP-Format:

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

Exportiert das Archiv MyMacApp.xcarchive als PKG-Datei in den Pfad MyMacApp.pkg mit der Anwendungsanwendung Identität der Kationensignatur Entwickler-ID-Anwendung: Mein Team. Die Signatur des Installationsprogramms für die Signatur Developer ID Installer: Mein Team wird implizit zum Signieren des exportierten Pakets verwendet.

Xcodebuild man

8
Suhaib

Wechseln Sie in den Ordner, in dem sich Ihr Projektstamm befindet, und:

xcodebuild -project projectname -activetarget -activeconfiguration archive
6
erick2red

Gehen Sie noch einen Schritt weiter und laden Sie über Xcode 7! Über die Befehlszeile in iTunesConnect hoch (vorausgesetzt, Sie beginnen mit einem .ipa, der mit dem korrekten Release-Profil und der Signaturidentität signiert wurde.)

Geben Sie altool ein, die CLI-Schnittstelle für den Application Loader ( docs , Seite 38) . Tief in Xcode.apps Struktur versteckt, ist dies eine praktische Funktion, mit der wir direkt in ItunesConnect hochladen können.

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

Führen Sie einfach $ altool --upload-app -f file -u username [-p password] aus, um Ihren neuen .ipa direkt auf Apple hochzuladen. Das Kennwort ist optional und fordert Sie auf, es einzugeben, wenn Sie den Befehl nicht verwenden. 

Wenn während des Überprüfungsschritts Probleme mit der App auftreten, werden diese von der Konsole gedruckt.

Sie müssen den Pfad wahrscheinlich nach altool exportieren, wenn Sie den Speicherort nicht speichern möchten.

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

Das ist es! Melden Sie sich einfach bei iTunesConnect.com an und wählen Sie Ihren neuen Build aus, um ihn mit testflight zu testen.

Letzte Anmerkung: Wenn Sie eine Fehlermeldung erhalten, die Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application sagt, können Sie dem Vorschlag auf this SO antworten folgen, um einen Symlink an die richtige Stelle zu setzen:

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

Um Vincent's Antwort zu verbessern, schrieb ich ein Skript, um dies zu tun: xcodearchive
Sie können Ihr Projekt über die Befehlszeile archivieren (ipa generieren) Stellen Sie sich dies wie die Schwester des xcodebuild-Befehls vor, jedoch zum Archivieren.

Code ist verfügbar auf github: http://github.com/gcerquant/xcodearchive


Eine Möglichkeit des Skripts besteht darin, die Archivierung der dSYM-Symbole in einem Zeitstempelarchiv zu ermöglichen. Keine Entschuldigung, die Symbole nicht mehr zu behalten und das Absturzprotokoll, das Sie möglicherweise erhalten, nicht symbolisieren zu können.

3
Guillaume

wenn Sie das nächste Tool verwenden: https://github.com/nomad/shenzhen

dann ist diese Aufgabe sehr einfach:

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

Quelle

2

probieren Sie xctool aus. Es ist ein Ersatz für Apples xcodebuild, mit dem Sie iOS- und Mac-Produkte einfacher erstellen und testen können. Dies ist besonders hilfreich für eine kontinuierliche Integration. Es hat ein paar zusätzliche Funktionen:

  1. Führt dieselben Tests wie Xcode.app aus. 
  2. Strukturierte Ausgabe von Build- und Testergebnissen. 
  3. Menschfreundliche, ANSI-farbige Ausgabe.

No.3 ist äußerst nützlich. Ich kann nicht, wenn jemand die Konsolenausgabe von xcodebuild lesen kann, ich kann es nicht, normalerweise gab es eine Zeile mit mehr als 5000 Zeichen. Noch schwerer zu lesen als eine Abschlussarbeit.

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

2
Zitao Xiong

Nach dem Update auf Xcode 8 habe ich festgestellt, dass Unternehmen IPA generieren 

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

Der Befehl kann wegen eines Signaturproblems nicht gestartet werden. Das Protokoll gibt an, dass "warning: PackageApplication nicht mehr empfohlen wird. Verwenden Sie stattdessen xcodebuild -exportArchive.

Also wechsle ich zu xcodebuild -exportArchive und alles ist wieder normal.

2
Bruce Chen

Sie meinen die Optionen zum Validieren/Teilen/Senden? Ich denke, diese sind spezifisch für Xcode und nicht für ein Befehlszeilentool geeignet. 

Ich wette, Sie könnten mit etwas Klugheit ein Skript erstellen, um es für Sie zu erledigen. Es sieht so aus, als würden sie nur in ~/Library/MobileDevice/Archived Applications/ mit einer UUDI und einer Plist gespeichert. Ich kann mir nicht vorstellen, dass es auch so schwer wäre, den Validator zurück zu entwickeln.

Der Prozess, an dem die Automatisierung interessiert ist, ist, Builds an Betatester zu senden. (Da die Übermittlung im App Store selten geschieht, macht es mir nichts aus, es manuell zu erledigen, zumal ich häufig neuen Beschreibungstext hinzufügen muss.) Durch das Erstellen eines Pseudo-Builds + Archivs mithilfe der Xcode-CLI kann ich automatische Builds aus jedem Code-Commit auslösen Erstellen Sie IPA-Dateien mit eingebetteten Bereitstellungsprofilen und senden Sie sie per E-Mail an Tester.

1
Michael Grinich

Wie kann ich ein iOS-Projekt mit dem Befehl erstellen?  

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


Was ist ExportOptions.plist?

ExportOptions.plist ist in Xcode erforderlich. Hier können Sie einige Optionen angeben, wenn Sie eine IPA-Datei erstellen. Sie können die Optionen in einer benutzerfreundlichen Benutzeroberfläche auswählen, wenn Sie Xcode zum Archivieren Ihrer App verwenden. 

Wichtig : Die Methode für Release und Entwicklung unterscheidet sich in ExportOptions.plist 

Appstore :  

exportOptions_release ~ method = App-Store 

Entwicklung  

exportOptions_dev ~ method = Entwicklung