Xcode "Build and Archive" dari baris perintah

392

Xcode 3.2 menyediakan fitur baru yang luar biasa di bawah menu Build, "Build and Archive" yang menghasilkan file .ipa yang cocok untuk distribusi Ad Hoc. Anda juga dapat membuka Organizer, buka "Aplikasi yang Diarsipkan," dan "Kirim Aplikasi ke iTunesConnect."

Apakah ada cara untuk menggunakan "Build and Archive" dari baris perintah (sebagai bagian dari skrip build)? Saya berasumsi bahwa xcodebuilditu akan terlibat entah bagaimana, tetapi manhalaman tampaknya tidak mengatakan apa-apa tentang ini.

PEMBARUAN Michael Grinich meminta klarifikasi; inilah yang sebenarnya tidak dapat Anda lakukan dengan build-line perintah, fitur yang HANYA dapat Anda lakukan dengan Xcode's Organizer setelah Anda "Build and Archive."

  1. Anda dapat mengklik "Bagikan Aplikasi ..." untuk membagikan IPA Anda dengan penguji beta. Seperti yang ditunjukkan Guillaume di bawah ini, karena beberapa keajaiban Xcode, file IPA ini tidak memerlukan file .mobileprovision yang didistribusikan secara terpisah yang harus diinstal oleh penguji beta; itu ajaib. Tidak ada skrip baris perintah yang bisa melakukannya. Misalnya, skrip Arrix (dikirim 1 Mei) tidak memenuhi persyaratan itu.
  2. Lebih penting lagi, setelah Anda menguji versi beta sebuah build, Anda dapat mengklik "Kirim Aplikasi ke iTunes Connect" untuk mengirimkan versi EXACT yang sama ke Apple, biner yang Anda uji, tanpa membangunnya kembali. Itu tidak mungkin dari baris perintah, karena menandatangani aplikasi adalah bagian dari proses pembuatan; Anda dapat menandatangani bit untuk pengujian beta Ad Hoc ATAU Anda dapat menandatanganinya untuk diserahkan ke App Store, tetapi tidak keduanya. Tidak ada IPA yang dibangun pada command-line yang dapat diuji beta pada ponsel dan kemudian dikirimkan langsung ke Apple.

Saya ingin seseorang datang dan membuktikan saya salah: kedua fitur ini bekerja sangat baik di GUI Xcode dan tidak dapat direplikasi dari baris perintah.

Dan Fabulich
sumber
1
Aduh, kasar. Tampaknya ini mustahil. Jika Anda tidak tahu jawabannya, setidaknya berikan suara untuk pertanyaan agar hadiah saya tidak hilang ke eter ... :-(
Dan Fabulich
3
Ini bukan tidak mungkin, itu hanya bukan bagian dari xcodebuild. Membuat file IPA hanya melibatkan menempatkan aplikasi ke direktori bernama "Payload", zip direktori itu, dan mengganti nama ke MyAppName.ipa.
Michael Grinich
@Michael, "Build and Archive" juga memungkinkan fitur Organizer, yang tidak tersedia ketika Anda hanya membuat file IPA dengan tangan.
Dan Fabulich
Komentar saya agak panjang, jadi itu diposting sebagai jawaban .
Michael Grinich
3
Meskipun jawaban pertama / diterima oleh vdaubry akan berfungsi, jawaban oleh Reid jauh lebih sederhana untuk versi Xcode yang lebih baru.
Prometheus

Jawaban:

314

Saya menemukan cara mengotomatiskan proses pembuatan dan pengarsipan dari baris perintah, saya baru saja menulis artikel blog yang menjelaskan bagaimana Anda dapat mencapainya.

Perintah yang harus Anda gunakan adalah 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}"

Anda akan menemukan semua detail di artikel . Jika Anda memiliki pertanyaan jangan ragu untuk bertanya.

vdaubry
sumber
19
Tidak jelas bagi saya untuk beberapa waktu, tetapi RELEASE_BUILDDIRperlu menjadi jalur absolut.
David Dunham
5
Perhatikan juga bahwa Anda tidak memerlukan opsi --sign atau --embed jika Anda ingin tetap menggunakan penandatanganan / profil yang sama ketika aplikasi .app dibuat. Ini akan menjadi apa pun yang Anda atur di pengaturan build Penandatanganan Kode untuk konfigurasi Rilis Anda.
Mike Weller
12
Perhatikan bahwa path file ipa -o "${ipa_path}"harus merupakan path absolut. Kalau tidak, Anda mungkin akan mendapatkan error: Unable to create '.../...ipa'atau akan diabaikan menciptakan diam-diam. Sialan itu menyia-nyiakan saya beberapa jam.
h - n
2
Dapatkah seseorang memberi tahu saya apa yang dilakukan oleh {} kawat gigi? Saya berasumsi mereka mengurus ruang kosong, tapi saya bisa saja salah.
scord
6
Xcode 8.3 Beta 1 menghapus perintah PackageApplication sepenuhnya. Jangan menggunakannya lagi dan gunakan arsip "xcodebuild -scheme <SchemeName>" seperti yang disarankan di bawah ini.
Hans Knöchel
283

Dengan Xcode 4.2 Anda dapat menggunakan flag -scheme untuk melakukan ini:

xcodebuild -scheme <SchemeName> archive

Setelah perintah ini, Arsip akan muncul di Xcode Organizer.

Reid Ellis
sumber
3
Ya, jauh lebih baik! Untuk membuatnya berfungsi, saya melakukan yang berikut: cd ke folder proyek Anda, kemudian jalankan "xcodebuild-scheme MyProjectName arsip" (karena biasanya, Anda memiliki skema dengan nama yang sama dengan nama proyek Anda)
Samuel
18
Perhatikan bahwa archivetindakan tidak menghormati pengaturan apa pun yang Anda berikan melalui doa ini, selain dari ruang kerja dan skema - ini hanya menghabiskan waktu berjam-jam !
danyowdee
5
Berfungsi dengan baik di Xcode 4.4 , dan saya yakin itu juga baik di 4.3. Pastikan Anda telah memilih rilis Xcode yang benar dengan menggunakanxcode-select <path to Xcode.app>
Reid Ellis
2
Juga, Anda harus menentukan skema dengan " -scheme <SchemeName>"
Reid Ellis
6
Ini bagus untuk membuat arsip, namun PackageApplication di xcrun sebenarnya membuat file .ipa. Anda memerlukan file ini untuk didistribusikan ke penguji beta melalui sesuatu seperti TestFlight
jmstone617
145

Memperbarui jawaban saya dengan Xcode 9 dan Swift

Arsipkan

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

Ekspor IPA ( harap perhatikan daftar opsi ekspor )

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

Bagi mereka yang tidak tahu tentang exportOptions.plist, https://blog.bitrise.io/new-export-options-plist-in-xcode-9


Mereka yang menggunakan ini untuk membangun proyek di alat CI / CD seperti teamcity / jenkins, pastikan Anda menggunakan xcode yang tepat yang dipasang di agen build untuk arsip dan ekspor.

Anda dapat menggunakan salah satu dari opsi di bawah 2 untuk ini.

  1. Gunakan path lengkap untuk xcodebuild,
/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild
  1. Gunakan pilih xcode,
xcode-select -switch /Applications/Xcode 9.3.1.app

Di bawah ini adalah jawaban lama saya

Berikut ini adalah skrip baris perintah untuk membuat arsip dan contoh IPA. Saya memiliki proyek xcode iPhone, yang terletak di folder Desktop / MyiOSApp.

Jalankan perintah berikut satu per satu:

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"

Ini diuji dengan Xcode 5 dan berfungsi dengan baik untuk saya.

Raj
sumber
2
Ini bekerja dengan baik pada Xcode6.1.1. Saya memilih untuk membangun aplikasi dari terminal karena Xcode6 memberi saya kesalahan "Akun Anda sudah memiliki sertifikat yang valid" ketika saya mencoba membangun distribusi AdHoc dari penyelenggara.
FormigaNinja
Jika Anda memiliki aplikasi WatchKit maka ada folder baru di ipa yang disebut WatchKitSupport serta folder Simbol (mungkin opsional). Apakah Anda tahu jika ada cara untuk mendapatkan exportArcive untuk mengekspornya juga?
RPM
1
xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchive sedang melempar kesalahan: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 yang ada di jawaban lama saya menyimpannya untuk menunjukkan referensi, Anda dapat melihat opsi ekspor yang valid di awal jawaban saya
Raj
1
@Raj yeap, terima kasih
Mohammad Reza Koohkan
29

Saya telah menggunakan skrip build saya sendiri untuk menghasilkan paket ipa untuk distribusi 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

Skrip juga menambah nomor versi. Anda dapat menghapus bagian itu jika tidak diperlukan. Semoga ini bisa membantu.

Tiba
sumber
3
Ini adalah solusi yang baik, meskipun kode Anda agak sulit dibaca tanpa komentar. Apakah Anda akan menulis lebih banyak tentang apa yang terjadi?
Michael Grinich
Di mana xcode mendapatkan nama "APPNAME.ipa"? Dari Kemasan-> Nama Produk?
Carlos Ricardo
3
Skrip ini tidak cukup sekarang dengan aplikasi WatchKit. Adakah yang tahu spesifikasi baru file ipa dengan aplikasi watchkit?
RPM
Melihat masalah yang sama dengan @RPM dengan kit arloji. Ada resolusi?
danieljimenez
@RPM, periksa ini untuk mengetahui hal-hal WatchKit. Saya belum mencobanya sendiri, tetapi sepertinya matrixprojects.net/p/watchkit-command-line-builds
mattman88
26

The xcodebuildalat dapat membangun dan mengekspor produk arsip dengan -exportArchive bendera (sebagai dari Xcode 5). Langkah ekspor sebelumnya hanya mungkin melalui UI Xcode Organizer.

Arsip dulu aplikasi Anda:

xcodebuild -scheme <scheme name> archive

Diberikan $ARCHIVE_PATH(jalur ke file .xcarchive ), ekspor aplikasi dari arsip dengan salah satu dari berikut ini:

File iOS .ipa :

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

File Mac .app :

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

Dalam kedua perintah tersebut -exportProvisioningProfile dan -exportSigningIdentity argumen adalah opsional. man xcodebuilduntuk detail tentang semantik. Dalam contoh ini, profil penyediaan untuk bangunan iOS menetapkan profil penyediaan distribusi AdHoc, dan identitas penandatanganan untuk aplikasi Mac menentukan ID Pengembang untuk diekspor sebagai aplikasi pihak ke-3 (yaitu tidak didistribusikan melalui Mac App Store).

Nik
sumber
1
Tidak berfungsi saat menggunakan ruang kerja xcode dan tidak kompatibel dengan cocopod
amleszk
1
Sudahkah Anda mencoba menambahkan -workspaceopsi ke xcodebuild (dan path ke ruang kerja)? man xcodebuildmenyatakan: "Untuk membangun ruang kerja Xcode, Anda harus melewati opsi -workspace dan -scheme untuk mendefinisikan bangunan".
Nik
Ini berfungsi baik bagi saya dengan opsi-workspace ditambahkan - Saya hanya perlu mendapatkan path arsip yang dibuat oleh perintah pertama, sehingga saya bisa memasukkannya ke dalam yang kedua. Anda dapat menentukan di mana arsip dibuat dengan opsi -archivePath, tapi saya lebih suka lokasi defaultnya. Ini membantu saya mencari cara untuk mendapatkan jalur itu: stackoverflow.com/a/9024901/813247
robotspacer
24

Kami mengembangkan aplikasi iPad dengan XCode 4.2.1 dan ingin mengintegrasikan bangunan ke dalam integrasi berkelanjutan kami (Jenkins) untuk distribusi OTA. Inilah solusi yang saya buat:

# 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

Kemudian Jenkins mengunggah file ipa, plist dan html ke server web kami.

Ini adalah template 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>

Untuk mengatur ini, Anda harus mengimpor sertifikat distribusi dan profil penyediaan ke gantungan kunci pengguna yang ditunjuk.

FuePi
sumber
3
Anda juga dapat mengubah file-plist dengan perintah Plistbuddy dari Apple, misalnya: / usr / libexec / PlistBuddy -c "Set: CFBundleVersion 1.2.3.4" /path/to/info.plist. Sebagai ganti bermain dengan SED :)
Jelle De Laender
Terimakasih atas infonya. Saya lebih berpengalaman dengan sed daripada plistbuddy, jadi saya memilih sed :)
FuePi
1
Saya sarankan $WORKSPACEdaripada $PWDuntuk menghasilkanAPP_PATH
Richard
16

Saya menemukan beberapa jawaban lain di sini sulit untuk ditindaklanjuti. Artikel ini ini cocok untuk saya. Beberapa jalur mungkin harus absolut, seperti yang disebutkan dalam jawaban lain.

Perintah:

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"
zekel
sumber
15

Anda BISA benar-benar mengundurkan diri dari build, seperti halnya XCode, sehingga Anda dapat menguji dan mengirimkan biner yang sama. Misalnya dalam skrip saya (mirip dengan yang di atas) saya membuat versi rilis saya yang ditandatangani sebagai bangunan AdHoc, lalu saya arsipkan itu sebagai IPA untuk pengujian, kemudian mengundurkan diri dengan sertifikat distribusi saya dan membuat file zip, yang saya kirim ke Apel. Baris yang relevan adalah:

codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
Bidang Duane
sumber
14

Untuk Xcode 7 , Anda memiliki solusi yang lebih sederhana. Satu-satunya pekerjaan tambahan adalah Anda harus membuat file konfigurasi untuk mengekspor arsip.

(Dibandingkan dengan Xcode 6, dalam hasil xcrun xcodebuild -help, -exportFormatdan -exportProvisioningProfileopsi tidak disebutkan lagi; yang pertama dihapus, dan yang terakhir digantikan oleh-exportOptionsPlist .)

Langkah 1 , ubah direktori ke folder termasuk file .xcodeproject atau .xcworkspace.

cd MyProjectFolder

Langkah 2 , gunakan Xcode atau /usr/libexec/PlistBuddy exportOptions.plistuntuk membuat file opsi ekspor opsi. Omong-omong, xcrun xcodebuild -helpakan memberi tahu Anda kunci apa yang harus Anda masukkan ke file plist.

Langkah 3 , buat file .xcarchive (folder, sebenarnya) sebagai berikut (build / direktori akan secara otomatis dibuat oleh Xcode sekarang),

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

Langkah 4 , ekspor sebagai file .ipa seperti ini, yang berbeda dari Xcode6

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

Sekarang, Anda mendapatkan file ipa di direktori build /. Kirimkan saja ke apple App Store.

Omong-omong, file ipa yang dibuat oleh Xcode 7 jauh lebih besar daripada oleh Xcode 6.

DawnSong
sumber
1
bagaimana Anda menentukan profil penyediaan dengan pendekatan ini. saya mencoba exportProvisioningProfile tetapi katanya tidak dapat digunakan dengan exportOptionsPlist ... dan tidak ada cara untuk menentukan profil di plist yang dapat saya temukan ... sepertinya hanya mengambil yang tertua dengan nama yang sama dengan yang ada yang membangunnya (yang merupakan kebalikan dari apa yang saya inginkan, sebenarnya)
john ellis
Pengaturan proyek, termasuk dalam file bernama "project.pbxproj", memiliki pengaturan penandatanganan, jadi -schemedan -configurationopsi menentukan cara menandatangani file ipa.
DawnSong
Ketika Anda mengatakan "kirim saja ke Apple", apakah proses itu karena ini di luar langkah-langkah Arsip normal?
mix3d
Ada dua cara untuk "mengirimnya ke Apple", masuk ke itunesconnect.apple.com , atau menggunakan Xcode-> Open Developer Tool-> Application Loader. @ mix3d
DawnSong
1
Saya akhirnya menemukan solusi yang sepenuhnya otomatis, yang mana saya telah membuat jawaban baru!
mix3d
14

Saya telah memberikan deskripsi singkat tentang langkah-langkah yang harus diikuti, dan parameter yang harus dilewati saat menghasilkan ipa menggunakan terrminal di bawah ini:

  1. Buka folder yang berisi file proyek MyApp.xcodeproject di terminal

  2. Dengan menggunakan perintah yang diberikan di bawah ini Anda akan mendapatkan semua Target aplikasi

    /usr/bin/xcodebuild -list 
  3. Setelah perintah di atas dijalankan, Anda akan mendapatkan daftar target yang harus Anda pilih target spesifik yang Anda butuhkan untuk menghasilkan .ipa

    /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
  4. Perintah di atas membangun proyek dan membuat file .app. Jalur untuk menemukan file .app adalah ./build/Release-iphoneos/MyApp.app

  5. Setelah Build berhasil, jalankan perintah berikut untuk menghasilkan .ipa aplikasi menggunakan Nama Pengembang dan Profil Penyediaan menggunakan sintaksis di bawah ini:

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

Penjelasan dari setiap Parameter dalam sintaks di atas:

${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 akan dihasilkan di direktori output yang dipilih " $ {OUTDIR} "
Teja Swaroop
sumber
Saya melihat kesalahan ini "aplikasi yang ditentukan tidak ada atau bukan direktori bundel"
Ansari Awais
2
Paket Aplikasi xcrun sudah usang.
Tunvir Rahman Tusher
8

Xcode 8:


Format IPA:

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

Mengekspor arsip MyMobileApp.xcarchive sebagai file IPA ke jalur MyMobileApp.ipa menggunakan profil penyediaan Profil Distribusi MyMobileApp.

Format Aplikasi:

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

Mengekspor arsip MyMacApp.xcarchive sebagai file PKG ke jalur MyMacApp.pkg menggunakan aplikasi aplikasi identitas kation penandatanganan ID Pengembang Aplikasi: Tim Saya. Identitas penandatangan penginstal Penginstal Penginstal ID: Tim Saya secara implisit digunakan untuk menandatangani paket yang diekspor.

Halaman manual Xcodebuild

Suhaib
sumber
7

Buka folder tempat root proyek Anda dan:

xcodebuild -project projectname -activetarget -activeconfiguration archive
erick2red
sumber
7
Ini sepertinya tidak berhasil. Buildaction 'arsip' tidak tersedia di XCode 3.2.2 (final).
Martin Cote
4

Selangkah lebih maju, mengunggah ke iTunesConnect melalui commandline dengan Xcode 7 ! (Dengan asumsi Anda mulai dengan .ipayang telah ditandatangani dengan profil rilis yang benar dan identitas penandatanganan.)

Masuk altool, antarmuka CLI untuk Application Loader ( docs, halaman 38). Tersembunyi jauh di dalam struktur Xcode.app, adalah fungsi praktis yang memungkinkan kami mengunggah langsung ke ItunesConnect.

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

Cukup jalankan $ altool --upload-app -f file -u username [-p password]untuk mengunggah yang baru dicetak.ipa langsung ke Apple. Kata sandi adalah opsional, dan akan meminta Anda untuk itu jika Anda mengabaikannya.

Jika ada masalah dengan aplikasi selama langkah verifikasi, konsol akan mencetaknya.

Anda kemungkinan harus mengekspor jalur ke altooljika Anda tidak ingin menyimpan lokasinya.

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

Itu dia! Cukup masuk ke iTunesConnect.com dan pilih bangunan baru Anda untuk pengujian dengan testflight.

Catatan Akhir: Jika Anda mendapatkan pesan kesalahan Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application, Anda dapat mengikuti saran pada jawaban SO ini , untuk menjalankan symlink ke lokasi yang benar:

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

Memperbaiki jawaban Vincent, saya menulis sebuah skrip untuk melakukan itu: xcodearchive
Memungkinkan Anda untuk mengarsipkan (menghasilkan ipa) proyek Anda melalui baris perintah. Pikirkan itu seperti saudara perempuan dari xcodebuildperintah, tetapi untuk pengarsipan.

Kode tersedia di github: http://github.com/gcerquant/xcodearchive


Salah satu opsi skrip adalah mengaktifkan pengarsipan simbol dSYM dalam arsip timestamped. Tidak ada alasan untuk tidak menyimpan simbol lagi, dan tidak dapat melambangkan log macet yang mungkin Anda terima nanti.

Guillaume
sumber
@KunalBalani Tidak, saya tidak akan mengharapkannya untuk menangani ruang kerja dengan benar. Lihat kode, tidak perlu banyak pekerjaan untuk menyesuaikannya. Selamat datang permintaan tarik!
Guillaume
3

Bagaimana cara membangun proyek iOS dengan perintah?

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


Apa itu ExportOptions.plist?

ExportOptions.plist diperlukan dalam Xcode. Ini memungkinkan Anda untuk menentukan beberapa opsi saat Anda membuat file ipa. Anda dapat memilih opsi dalam UI yang ramah saat Anda menggunakan Xcode untuk mengarsipkan aplikasi Anda.

Penting : Metode untuk rilis dan pengembangan berbeda di ExportOptions.plist

AppStore:

exportOptions_release ~ method = app-store

Pengembangan

exportOptions_dev ~ method = pengembangan

Hasnain Haider K Niazi
sumber
2

coba xctool, itu adalah pengganti untuk xcodebuild Apple yang membuatnya lebih mudah untuk membangun dan menguji produk iOS dan Mac. Ini sangat membantu untuk integrasi berkelanjutan. Ini memiliki beberapa fitur tambahan:

  1. Menjalankan tes yang sama seperti Xcode.app.
  2. Output terstruktur dari hasil build dan test.
  3. Manusia-ramah, keluaran ANSI berwarna.

No.3 sangat berguna. Saya tidak tahu apakah ada yang bisa membaca output konsol xcodebuild, saya tidak bisa, biasanya itu memberi saya satu baris dengan lebih dari 5000 karakter. Bahkan lebih sulit dibaca daripada makalah tesis.

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

Zitao Xiong
sumber
2

jika Anda menggunakan alat berikutnya: https://github.com/nomad/shenzhen

maka tugas ini sangat mudah:

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

sumber

Maxim Kholyavkin
sumber
2

Setelah memperbarui ke Xcode 8, saya menemukan bahwa perusahaan menghasilkan dengan ipa

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

Perintah tidak dapat diluncurkan karena beberapa masalah tanda tangan. Log menunjukkan bahwa "peringatan: PackageApplication sudah usang, gunakan xcodebuild -exportArchivesaja.

Jadi saya beralih ke xcodebuild -exportArchivedan semuanya kembali normal.

Jidong Chen
sumber
1

Maksud Anda opsi validasi / bagikan / kirim? Saya pikir itu khusus untuk Xcode, dan tidak cocok untuk alat membangun baris perintah.

Dengan sedikit kepintaran, saya yakin Anda bisa membuat naskah untuk melakukannya untuk Anda. Sepertinya mereka baru saja disimpan ~/Library/MobileDevice/Archived Applications/dengan UUDI dan plist. Saya tidak bisa membayangkan akan sulit untuk merekayasa balik validatornya juga.

Proses yang saya minati mengotomatiskan mengirimkan build ke penguji beta. (Karena pengiriman App Store jarang terjadi, saya tidak keberatan melakukannya secara manual, terutama karena saya sering perlu menambahkan teks deskripsi baru.) Dengan melakukan Build + Archive semu menggunakan CLI Xcode, saya dapat memicu build otomatis dari setiap komit kode, buat file IPA dengan profil bawaan yang tertanam, dan kirimkan melalui email ke penguji.

Michael Grinich
sumber
Saya mengklarifikasi pertanyaan saya. Ketika Anda mengatakan "Saya bisa" di atas, apakah maksud Anda Anda benar-benar dapat melakukan ini hari ini?
Dan Fabulich
2
Iya. Saya menggunakan Hudson Continuous Integration dengan skrip khusus yang berjalan xcodebuilddan membuat IPA.
Michael Grinich
Maaf saya terlambat ke pesta, tetapi TestFlight memiliki API unggahan super mudah yang harus Anda periksa
self.name