Xcode "Erstellen und Archivieren" über die Befehlszeile


392

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

Gibt es eine Möglichkeit, "Erstellen und Archivieren" über die Befehlszeile (als Teil eines Erstellungsskripts) zu verwenden? Ich würde annehmen, dass xcodebuilddas irgendwie involviert wäre, aber die manSeite scheint nichts darüber zu sagen.

UPDATE Michael Grinich bat um Klarstellung; Hier ist, was genau Sie mit Befehlszeilen-Builds nicht tun können. Funktionen, die Sie NUR mit Xcode's Organizer ausführen können, nachdem Sie "Build and Archive" erstellt haben.

  1. Sie können auf "Anwendung teilen ..." klicken, um Ihre IPA für Betatester freizugeben. Wie Guillaume weiter unten ausführt, erfordert diese IPA-Datei aufgrund von Xcode-Magie keine separat verteilte .mobileprovision-Datei, die Betatester installieren müssen. Das ist magisch. Kein Befehlszeilenskript kann dies tun. Zum Beispiel erfüllt das Skript von Arrix (eingereicht am 1. Mai) diese Anforderung nicht.
  2. Noch wichtiger ist, dass Sie nach dem Betatest eines Builds auf "Anwendung an iTunes Connect senden" klicken können, um diesen GENAUEN Build an Apple, die von Ihnen getestete Binärdatei, zu senden, ohne ihn neu zu erstellen. Dies ist über die Befehlszeile nicht möglich, da das Signieren der App Teil des Erstellungsprozesses ist. Sie können Bits für Ad-hoc-Betatests signieren ODER Sie können sie für die Übermittlung an den App Store signieren, jedoch nicht für beide. Kein auf der Befehlszeile basierendes IPA kann auf Telefonen Beta-getestet und dann direkt an Apple gesendet werden.

Ich würde mich freuen, wenn jemand mitkommt und mir das Gegenteil beweist: Beide Funktionen funktionieren hervorragend in der Xcode-Benutzeroberfläche und können nicht über die Befehlszeile repliziert werden.


1
Oh, grob. Dies scheint unmöglich zu sein. Wenn Sie die Antwort nicht kennen, stimmen Sie bitte zumindest die Frage ab, damit mein Kopfgeld nicht im Äther verschwindet ... :-(
Dan Fabulich

3
Das ist nicht unmöglich, es ist einfach nicht Teil von xcodebuild. Beim Erstellen einer IPA-Datei wird die App lediglich in ein Verzeichnis mit dem Namen "Payload" verschoben, dieses Verzeichnis komprimiert und in MyAppName.ipa umbenannt.
Michael Grinich

@Michael, "Erstellen und Archivieren" aktiviert auch die Organizer-Funktionen, die nicht verfügbar sind, wenn Sie nur eine IPA-Datei von Hand erstellen.
Dan Fabulich

Mein Kommentar wurde etwas lang, daher wurde er als Antwort veröffentlicht .
Michael Grinich

3
Obwohl die erste / akzeptierte Antwort von vdaubry funktioniert, ist die Antwort von Reid für die neueren Versionen von Xcode viel einfacher.
Prometheus

Antworten:


314

Ich habe herausgefunden, wie der Erstellungs- und Archivierungsprozess über die Befehlszeile automatisiert werden kann. Ich habe gerade einen Blog-Artikel geschrieben erklärt wird, wie Sie dies erreichen können.

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

Alle Details finden Sie im Artikel . Wenn Sie Fragen haben, zögern Sie nicht zu fragen.


19
Für mich seit einiger Zeit nicht offensichtlich, RELEASE_BUILDDIRmuss aber ein absoluter Weg sein.
David Dunham

5
Beachten Sie auch, dass Sie die Optionen --sign oder --embed nicht benötigen, wenn Sie das gleiche Signatur- / Profil beibehalten möchten, das beim Erstellen der .app verwendet wurde. Dies ist alles, was Sie in den Build-Einstellungen für die Codesignatur für Ihre Release-Konfiguration eingerichtet haben.
Mike Weller

12
Beachten Sie, dass der ipa-Dateipfad in -o "${ipa_path}"ein absoluter Pfad sein muss. Andernfalls erhalten Sie wahrscheinlich error: Unable to create '.../...ipa'oder es wird stillschweigend ignoriert erstellen. Verdammt, es hat mich ein paar Stunden verschwendet.
h - n

2
Kann mir jemand sagen, was die {} Klammern tun? Ich gehe davon aus, dass sie sich um Leerzeichen kümmern, aber ich könnte mich irren.
Scord

6
Xcode 8.3 Beta 1 Entfernen Sie den Befehl PackageApplication vollständig. Verwenden Sie es nicht erneut und verwenden Sie "xcodebuild -scheme <SchemeName> archive", wie unten vorgeschlagen.
Hans Knöchel

283

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.


3
Ja viel besser! Damit es funktioniert, habe ich Folgendes getan: CD in Ihren Projektordner und dann "xcodebuild -scheme MyProjectName archive" ausführen (da Sie normalerweise ein Schema mit demselben Namen wie Ihr Projektname haben)
Samuel

18
Beachten Sie, dass die archiveAktion keine Einstellungen berücksichtigt , die Sie durch diesen Aufruf bereitgestellt haben, außer dem Arbeitsbereich und dem Schema - dies hat mich nur Stunden gekostet !
Danyowdee

5
Funktioniert gut in Xcode 4.4 und ich bin sicher, dass es auch in 4.3 gut war. Stellen Sie sicher, dass Sie die richtige Xcode-Version ausgewählt haben, indem Siexcode-select <path to Xcode.app>
Reid Ellis

2
Auch Sie müssen das Schema mit „angeben -scheme <SchemeName>
Reid Ellis

6
Dies ist in Ordnung für die Erstellung des Archivs, jedoch erstellt die PackageApplication in xcrun tatsächlich die IPA-Datei. Sie benötigen diese Datei für die Verteilung an Betatester über TestFlight
jmstone617

145

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 beachten Sie die Exportoptionsliste )

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

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


Wenn Sie dies für das Erstellen von Projekten in CI / CD-Tools wie teamcity / jenkins verwenden, stellen Sie bitte sicher, dass Sie den richtigen xcode verwenden, der im Build-Agent für Archivierung und Export installiert ist.

Sie können hierfür 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. Verwenden Sie xcode-select,
xcode-select -switch /Applications/Xcode 9.3.1.app

Unten ist meine alte Antwort

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

Führen Sie nacheinander folgende Befehle 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 ist mit Xcode 5 getestet und funktioniert gut für mich.


2
Es hat perfekt auf Xcode6.1.1 funktioniert. Ich entscheide mich, meine Apps vom Terminal aus zu erstellen, da Xcode6 mir den Fehler "Ihr Konto hat bereits ein gültiges Zertifikat" anzeigt, wenn ich versuche, eine AdHoc-Distribution vom Organizer aus zu erstellen.
FormigaNinja

Wenn Sie eine WatchKit-App haben, gibt es im ipa einen neuen Ordner namens WatchKitSupport sowie einen Symbolordner (möglicherweise optional). Wissen Sie, ob es eine Möglichkeit gibt, das exportArcive dazu zu bringen, diese auch zu exportieren?
RPM

1
xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchive wirft Fehler:requires a provisioning profile with the Associated Domains feature. Select a provisioning profile for the "Release" build configuration in the project editor.
vbRocks

1
@MohammadRezaKoohkan, das in der alten Antwort war Ich habe es behalten, um die Referenz zu zeigen. Sie können die gültige Exportoption am Anfang meiner Antwort sehen
Raj

1
@ Raj yeap, danke
Mohammad Reza Koohkan

29

Ich habe mein eigenes Build-Skript verwendet, um das ipa-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 diesen Teil entfernen, wenn er nicht benötigt wird. Ich hoffe es hilft.


3
Dies ist eine gute Lösung, obwohl Ihr Code ohne Kommentare etwas schwer zu lesen ist. Würdest du ein bisschen mehr darüber schreiben, was passiert?
Michael Grinich

Woher bekommt xcode den Namen "APPNAME.ipa"? Von Verpackung-> Produktname?
Carlos Ricardo

3
Dieses Skript reicht jetzt mit der WatchKit-App nicht mehr aus. Kennt jemand die neuen Spezifikationen der IPA-Datei mit der Watchkit-App?
RPM

Es werden dieselben Probleme wie bei @RPM mit dem Uhrenkit angezeigt. Irgendeine Lösung?
Danieljimenez

@RPM Schauen Sie sich das WatchKit-Zeug an. Ich habe es nicht selbst versucht, aber es scheint ziemlich gründlich matrixprojects.net/p/watchkit-command-line-builds
mattman88

26

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

Archivieren Sie zuerst Ihre App:

xcodebuild -scheme <scheme name> archive

Gegeben $ARCHIVE_PATH(der Weg zum .xcarchive Datei) angegeben ist, exportieren Sie die App aus dem Archiv mit einer der folgenden :

iOS .ipa Datei:

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 xcodebuildEinzelheiten zur Semantik. In diesen Beispielen wurde im Bereitstellungsprofil für den iOS-Build ein AdHoc-Verteilungsbereitstellungsprofil angegeben, und in der Signaturidentität für die Mac-App wurde eine Entwickler-ID für den Export als Drittanbieteranwendung angegeben (dh nicht über den Mac App Store verteilt).


1
Funktioniert nicht bei Verwendung von xcode-Arbeitsbereichen und ist nicht mit Cocopods kompatibel
amleszk

1
Haben Sie versucht, die -workspaceOption zu xcodebuild (und einen Pfad zu einem Arbeitsbereich) hinzuzufügen ? man xcodebuildheißt es: "Um einen Xcode-Arbeitsbereich zu erstellen, müssen Sie die Optionen -workspace und -scheme übergeben, um den Build zu definieren."
Nik

Dies funktioniert hervorragend für mich, wenn die Option -workspace hinzugefügt wurde. Ich musste nur den Pfad des Archivs abrufen, das mit dem ersten Befehl erstellt wurde, damit ich ihn in den zweiten einspeisen konnte. Sie können mit der Option -archivePath angeben, wo das Archiv erstellt wird, aber ich bevorzuge den Standardspeicherort. Dies half mir herauszufinden, wie ich diesen Pfad bekommen kann: stackoverflow.com/a/9024901/813247
robotspacer

24

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 gefunden 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 ipa-, plist- und html-Dateien 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.


3
Sie können eine Plist-Datei auch mit dem Plistbuddy-Befehl von Apple ändern, z. B.: / Usr / libexec / PlistBuddy -c "Set: CFBundleVersion 1.2.3.4" /path/to/info.plist. Anstatt mit SED zu spielen :)
Jelle De Laender

Danke für die Information. Ich bin erfahrener mit sed als mit plistbuddy, also wähle ich sed :)
FuePi

1
Ich empfehle $WORKSPACEstatt $PWDzu generierenAPP_PATH
Richard

16

Ich fand einige der anderen Antworten hier schwierig, um loszulegen. Dieser Beitrag hat 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"

15

Sie KÖNNEN einen Build tatsächlich zurücktreten, genau wie XCode, damit Sie dieselbe Binärdatei testen und versenden können. Zum Beispiel erstelle ich in meinem Skript (ähnlich wie oben) meine als AdHoc-Build signierte Release-Version, archiviere sie dann als IPA zum Testen, trete dann mit meinem Distributionszertifikat zurück und erstelle eine Zip-Datei, an die ich sende Apfel. Die relevante Zeile lautet:

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

14

Für Xcode 7 haben Sie eine viel einfachere Lösung. Die einzige zusätzliche Arbeit besteht darin, dass Sie eine Konfigurationsplist-Datei für den Export des Archivs erstellen müssen.

( Im Vergleich zu Xcode 6, in den Ergebnissen xcrun xcodebuild -help, -exportFormatund -exportProvisioningProfileOptionen genannt werden nicht mehr, erstere gelöscht werden, und letzteres wird ersetzt durch-exportOptionsPlist .)

Schritt 1 : Wechseln Sie in das Verzeichnis einschließlich der Datei .xcodeproject oder .xcworkspace.

cd MyProjectFolder

Schritt 2 : Verwenden Sie Xcode oder /usr/libexec/PlistBuddy exportOptions.plist, um eine Plist-Datei für Exportoptionen zu erstellen. Übrigens xcrun xcodebuild -helperfahren Sie, welche Schlüssel Sie in die Plist-Datei einfügen müssen.

Schritt 3 : Erstellen Sie die .xcarchive-Datei (tatsächlich Ordner) wie folgt (build / directory wird jetzt automatisch von Xcode erstellt).

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

Schritt 4 : Exportieren Sie als .ipa-Datei wie folgt, die sich von Xcode6 unterscheidet

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

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

Die von Xcode 7 erstellte ipa-Datei ist übrigens viel größer als von Xcode 6.


1
Wie legen Sie das Bereitstellungsprofil mit diesem Ansatz fest? Ich habe das exportProvisioningProfile ausprobiert, aber es sagte, dass es nicht mit exportOptionsPlist verwendet werden kann ... und es gibt keine Möglichkeit, das Profil in der Liste anzugeben, das ich finden kann ... es scheint nur das älteste mit dem gleichen Namen wie das zu nehmen das baute es (was das Gegenteil von dem ist, was ich wirklich will)
John Ellis

Projekteinstellungen in einer Datei mit dem Namen „project.pbxproj“ enthielten, haben die Unterzeichnung Einstellungen, so -schemeund -configurationOptionen festgelegt , wie die IPV - Datei signieren.
DawnSong

Wenn Sie "nur an Apple senden" sagen, wie sieht dieser Vorgang aus, da dies außerhalb der normalen Archivierungsschritte liegt?
mix3d

Es gibt zwei Möglichkeiten, "es an Apple zu senden", sich bei itunesconnect.apple.com anzumelden oder Xcode-> Open Developer Tool-> Application Loader zu verwenden. @ mix3d
DawnSong

1
Am Ende fand ich eine vollautomatische Lösung, für die ich eine neue Antwort erstellt habe!
mix3d

14

Ich habe eine kurze Beschreibung der folgenden Schritte und Parameter gegeben, die beim Generieren eines IPA mit dem folgenden Terrminal übergeben werden müssen:

  1. Wechseln Sie in den Ordner, der die Datei MyApp.xcodeproject im Terminal enthält

  2. Mit dem unten angegebenen Befehl erhalten Sie alle Ziele der Anwendung

    /usr/bin/xcodebuild -list 
  3. Nachdem der obige Befehl ausgeführt wurde, erhalten Sie eine Liste der Ziele, von denen 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 Suchen der .app-Datei lautet ./build/Release-iphoneos/MyApp.app

  5. Nachdem die Erstellung erfolgreich war, führen Sie den folgenden Befehl aus, um die 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}”

Erläuterung der einzelnen Parameter 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.

Ich sehe diesen Fehler "angegebene Anwendung existiert nicht oder ist kein Bundle-Verzeichnis"
Ansari Awais

2
xcrun PackageApplication ist veraltet.
Tunvir Rahman Tusher

8

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 mithilfe des Bereitstellungsprofils 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 unter Verwendung der Kationssignaturidentität der Anwendungsanwendung. Entwickler-ID Anwendung: Mein Team. Das Installationsprogramm signiert Identität Entwickler-ID Installationsprogramm: Mein Team wird implizit zum Signieren des exportierten Pakets verwendet.

Xcodebuild Manpage


7

Gehen Sie zu dem Ordner, in dem sich Ihr Projektstamm befindet, und:

xcodebuild -project projectname -activetarget -activeconfiguration archive

7
Das scheint nicht zu funktionieren. Die 'Archiv'-Buildaktion ist in XCode 3.2.2 (final) nicht verfügbar.
Martin Cote

4

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

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

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

Einfach ausführen $ altool --upload-app -f file -u username [-p password], um Ihre neu geprägte Datei hochzuladen.ipa direkt auf Apple . Das Kennwort ist optional und fordert Sie dazu auf, wenn Sie den Befehl nicht verwenden.

Wenn während des Überprüfungsschritts Probleme mit der App auftreten, druckt die Konsole diese aus.

Sie müssen den Pfad wahrscheinlich exportieren, altoolwenn Sie seinen 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 zum Testen mit testflight aus.

Schlussbemerkung: Wenn Sie eine Fehlermeldung erhalten, Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the applicationkönnen Sie dem Vorschlag in dieser SO-Antwort folgen , um einen Symlink zum richtigen Speicherort auszuführen:

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

3

Um Vincents Antwort zu verbessern, habe ich dazu ein Skript geschrieben: xcodearchive
Es ermöglicht Ihnen, Ihr Projekt über die Befehlszeile zu archivieren (ein ipa zu generieren). Stellen Sie es sich wie die Schwester des xcodebuildKommandos vor, aber zur Archivierung.

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


Eine Option des Skripts besteht darin, die Archivierung der dSYM-Symbole in einem Archiv mit Zeitstempel zu aktivieren. Keine Entschuldigung, die Symbole nicht mehr beizubehalten und das Absturzprotokoll, das Sie möglicherweise später erhalten, nicht mehr zu symbolisieren.


@KunalBalani Nein, ich würde nicht erwarten, dass der Arbeitsbereich korrekt behandelt wird. Schauen Sie sich den Code an, es würde nicht viel Arbeit kosten, ihn anzupassen. Pull-Anfragen willkommen!
Guillaume

3

Wie erstelle ich ein iOS-Projekt mit einem Befehl?

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 Ihre App mit Xcode archivieren.

Wichtig : Die Methode zur Freigabe und Entwicklung unterscheidet sich im AppStore von ExportOptions.plist

:

exportOptions_release ~ method = App-Store

Entwicklung

exportOptions_dev ~ method = development


2

Probieren Sie xctool aus. Es ist ein Ersatz für Apples xcodebuild, der das Erstellen und Testen von iOS- und Mac-Produkten erleichtert. Dies ist besonders hilfreich für die 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. Menschenfreundliche, ANSI-farbige Ausgabe.

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

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



2

Nach dem Update auf Xcode 8 stellte ich fest, dass Enterprise-IPA von generiert wird

/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 aufgrund eines Signaturproblems nicht gestartet werden. Das Protokoll gibt an, dass "Warnung: PackageApplication ist veraltet, verwenden Sie xcodebuild -exportArchivestattdessen.

Also wechselte ich zu xcodebuild -exportArchiveund alles ging wieder normal.


1

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

Ich wette, Sie könnten mit etwas Klugheit ein Skript erstellen, um es für Sie zu erledigen. Es sieht so aus, ~/Library/MobileDevice/Archived Applications/als wären sie nur mit einem UUDI und einer Plist gespeichert . Ich kann mir nicht vorstellen, dass es so schwierig sein würde, den Validator zurückzuentwickeln.

Der Prozess, den ich automatisieren möchte, ist das Senden von Builds an Betatester. (Da die Übermittlung von App Stores selten erfolgt, macht es mir nichts aus, dies manuell zu tun, insbesondere da ich häufig neuen Beschreibungstext hinzufügen muss.) Durch Ausführen eines Pseudo-Build + -Archivs mit der CLI von Xcode 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.


Ich habe meine Frage geklärt. Wenn Sie oben "Ich kann" sagen, meinen Sie damit, dass Sie dies heute tatsächlich tun können?
Dan Fabulich

2
Ja. Ich verwende Hudson Continuous Integration mit einem benutzerdefinierten Skript, das ausgeführt wird xcodebuildund eine IPA erstellt.
Michael Grinich

Tut mir leid, dass ich zu spät zur Party komme, aber TestFlight hat eine super einfache Upload-API, die du dir
ansehen solltest
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.