450 Stimmen

Xcode "Erstellen und Archivieren" von der Kommandozeile aus

Xcode 3.2 bietet eine großartige neue Funktion im Menü "Build", "Build and Archive", die eine .ipa-Datei für die Ad-hoc-Verteilung erzeugt. Sie können auch den Organizer öffnen, zu "Archivierte Programme" gehen und "Programm bei iTunesConnect einreichen".

Gibt es eine Möglichkeit, "Build and Archive" von der Kommandozeile aus zu verwenden (als Teil eines Build-Skripts)? Ich würde annehmen, dass xcodebuild irgendwie involviert sein würde, aber die man Seite scheint nichts darüber zu sagen.

UPDATE Michael Grinich bat um eine Klarstellung; hier ist, was genau Sie nicht mit Befehlszeilen-Builds tun können, Funktionen, die Sie NUR mit dem Organizer von Xcode tun können, nachdem Sie "Build and Archive".

  1. Sie können auf "Share Application..." klicken, um Ihre IPA mit Beta-Testern zu teilen. Wie Guillaume weiter unten ausführt, benötigt diese IPA-Datei dank einiger Xcode-Magie keine separat verteilte .mobileprovision-Datei, die die Betatester installieren müssen; das ist magisch. Kein Kommandozeilenskript kann das. Das Skript von Arrix (eingereicht am 1. Mai) zum Beispiel erfüllt diese Anforderung nicht.
  2. Noch wichtiger ist, dass Sie nach dem Betatest eines Builds auf "Programm bei iTunes Connect einreichen" klicken können, um genau das gleiche Build bei Apple einzureichen, nämlich das von Ihnen getestete Binärprogramm, ohne es neu zu erstellen. Das ist von der Kommandozeile aus nicht möglich, weil das Signieren der App Teil des Build-Prozesses ist; man kann Bits für Ad-hoc-Beta-Tests signieren ODER man kann sie für die Einreichung im App Store signieren, aber nicht beides. Keine IPA, die auf der Kommandozeile erstellt wurde, kann auf Telefonen einem Betatest unterzogen werden und dann direkt bei Apple eingereicht werden.

Ich würde mich freuen, wenn mich jemand eines Besseren belehren könnte: Beide Funktionen funktionieren hervorragend in der Xcode-GUI und können nicht über die Befehlszeile repliziert werden.

25voto

FuePi Punkte 1791

Wir haben eine iPad-App mit XCode 4.2.1 entwickelt und wollten den Build in unsere kontinuierliche Integration (Jenkins) für die OTA-Verteilung 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 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 betreffenden Benutzers importieren.

16voto

zekel Punkte 8775

Ich fand einige der anderen Antworten hier schwer in Gang zu bringen. Dieser Artikel hat es für mich getan. 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"

15voto

Duane Fields Punkte 1331

Sie KÖNNEN tatsächlich einen Build zurücktreten, genau wie XCode es tut, so dass Sie die gleiche Binärdatei testen und versenden können. Zum Beispiel in meinem Skript (ähnlich wie die oben genannten) Ich baue meine Release-Version als AdHoc-Build signiert, dann archiviere ich, dass als IPA zum Testen, dann zurücktreten mit meiner Verteilung cert und erstellen Sie eine Zip-Datei, die ist, was ich an Apple senden. Die relevante Zeile ist:

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

14voto

Teja Swaroop Punkte 1129

Ich habe eine kurze Beschreibung der zu befolgenden Schritte und der zu übergebenden Parameter bei der Erstellung einer ipa mit terrminal unten gegeben:

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

  2. Mit dem folgenden Befehl erhalten Sie alle Ziele der Anwendung

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

    /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
  4. Mit dem obigen Befehl wird das Projekt erstellt und eine .app-Datei erzeugt, die unter folgendem Pfad zu finden ist ./build/Release-iphoneos/MyApp.app

  5. Nachdem die Erstellung erfolgreich war, führen Sie den folgenden Befehl aus, um eine .ipa-Datei der Anwendung unter Verwendung des Entwicklernamens und des Bereitstellungsprofils mit der folgenden Syntax zu erstellen:

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

14voto

DawnSong Punkte 3836

Para Xcode 7 haben Sie eine viel einfachere Lösung. Die einzige zusätzliche Arbeit ist, dass Sie eine Konfigurationsdatei für den Export von Archiven erstellen müssen.

(Im Vergleich zu Xcode 6, in den Ergebnissen von xcrun xcodebuild -help , -exportFormat y -exportProvisioningProfile werden nicht mehr erwähnt; die erste Option wurde gestrichen, und die zweite wird ersetzt durch -exportOptionsPlist .)

Schritt 1 Wechseln Sie in das Verzeichnis, das die .xcodeproject- oder .xcworkspace-Datei enthält.

cd MyProjectFolder

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

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

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

Schritt 4 exportieren Sie als .ipa-Datei wie folgt, was sich von Xcode6 unterscheidet

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

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X