Proyek contoh kami memiliki dua target pembangunan: HelloWorld.app dan Helper.app. Kami membuat paket komponen untuk masing-masing dan menggabungkannya ke dalam arsip produk .
Sebuah paket komponen berisi muatan yang akan diinstal oleh X Installer OS. Meskipun paket komponen dapat diinstal sendiri, paket itu biasanya dimasukkan ke dalam arsip produk .
Setelah "Build and Archive" berhasil, buka $ BUILT_PRODUCTS_DIR di Terminal.
$ cd ~/Library/Developer/Xcode/DerivedData/.../InstallationBuildProductsLocation
$ pkgbuild --analyze --root ./HelloWorld.app HelloWorldAppComponents.plist
$ pkgbuild --analyze --root ./Helper.app HelperAppComponents.plist
Ini memberi kita komponen-plist, Anda menemukan deskripsi nilai di bagian "Daftar Properti Komponen" . pkgbuild -root menghasilkan paket komponen , jika Anda tidak perlu mengubah properti default apa pun, Anda dapat menghilangkan parameter --component-plist pada perintah berikut.
productbuild - hasil sintesis dalam Definisi Distribusi .
$ pkgbuild --root ./HelloWorld.app \
--component-plist HelloWorldAppComponents.plist \
HelloWorld.pkg
$ pkgbuild --root ./Helper.app \
--component-plist HelperAppComponents.plist \
Helper.pkg
$ productbuild --synthesize \
--package HelloWorld.pkg --package Helper.pkg \
Distribution.xml
Di Distribution.xml Anda dapat mengubah hal-hal seperti judul, latar belakang, selamat datang, readme, lisensi, dan sebagainya. Anda mengubah paket komponen dan definisi distribusi Anda dengan perintah ini menjadi arsip produk :
$ productbuild --distribution ./Distribution.xml \
--package-path . \
./Installer.pkg
Saya sarankan untuk melihatnya iTunes Installers Distribution.xml untuk melihat apa yang mungkin. Anda dapat mengekstrak "Instal iTunes.pkg" dengan:
$ pkgutil --expand "Install iTunes.pkg" "Install iTunes"
Mari kita kumpulkan
Saya biasanya memiliki folder bernama Paket dalam proyek saya yang mencakup hal-hal seperti Distribution.xml, komponen-plists, sumber daya dan skrip.
Tambahkan Fase Pembuatan Skrip Run yang dinamai "Generate Package", yang disetel ke skrip Run hanya saat menginstal :
VERSION=$(defaults read "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/Contents/Info" CFBundleVersion)
PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
TMP1_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp1.pkg"
TMP2_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp2"
TMP3_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp3.pkg"
ARCHIVE_FILENAME="${BUILT_PRODUCTS_DIR}/${PACKAGE_NAME}.pkg"
pkgbuild --root "${INSTALL_ROOT}" \
--component-plist "./Package/HelloWorldAppComponents.plist" \
--scripts "./Package/Scripts" \
--identifier "com.test.pkg.HelloWorld" \
--version "$VERSION" \
--install-location "/" \
"${BUILT_PRODUCTS_DIR}/HelloWorld.pkg"
pkgbuild --root "${BUILT_PRODUCTS_DIR}/Helper.app" \
--component-plist "./Package/HelperAppComponents.plist" \
--identifier "com.test.pkg.Helper" \
--version "$VERSION" \
--install-location "/" \
"${BUILT_PRODUCTS_DIR}/Helper.pkg"
productbuild --distribution "./Package/Distribution.xml" \
--package-path "${BUILT_PRODUCTS_DIR}" \
--resources "./Package/Resources" \
"${TMP1_ARCHIVE}"
pkgutil --expand "${TMP1_ARCHIVE}" "${TMP2_ARCHIVE}"
# Patches and Workarounds
pkgutil --flatten "${TMP2_ARCHIVE}" "${TMP3_ARCHIVE}"
productsign --sign "Developer ID Installer: John Doe" \
"${TMP3_ARCHIVE}" "${ARCHIVE_FILENAME}"
Jika Anda tidak perlu mengubah paket setelah dibuat dengan productbuild, Anda dapat menyingkirkan pkgutil --expand
dan pkgutil --flatten
langkah - langkahnya. Juga Anda bisa menggunakan --sign paramenter pada productbuild bukan berjalan productsign .
Tanda tangani Pemasang OS X
Paket ditandatangani dengan sertifikat Pemasang ID Pengembang yang dapat Anda unduh dari Utilitas Sertifikat Pengembang .
Penandatanganan mereka dilakukan dengan --sign "Developer ID Installer: John Doe"
parameter pkgbuild , productbuild atau productsign .
Perhatikan bahwa jika Anda akan membuat arsip produk yang ditandatangani menggunakan productbuild, tidak ada alasan untuk menandatangani paket komponen .
Semua jalan: Salin Paket ke Arsip Xcode
Untuk menyalin sesuatu ke Arsip Xcode kita tidak bisa menggunakan Fase Pembuatan Skrip Jalankan . Untuk ini, kita perlu menggunakan Skema Aksi.
Edit Skema dan perluas Arsip. Kemudian klik post-action dan tambahkan New Run Script Action :
Dalam Xcode 6:
#!/bin/bash
PACKAGES="${ARCHIVE_PATH}/Packages"
PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
ARCHIVE_FILENAME="$PACKAGE_NAME.pkg"
PKG="${OBJROOT}/../BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"
if [ -f "${PKG}" ]; then
mkdir "${PACKAGES}"
cp -r "${PKG}" "${PACKAGES}"
fi
Di Xcode 5, gunakan nilai ini sebagai PKG
gantinya:
PKG="${OBJROOT}/ArchiveIntermediates/${TARGET_NAME}/BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"
Jika kontrol versi Anda tidak menyimpan informasi Skema Xcode, saya sarankan untuk menambahkan ini sebagai skrip shell ke proyek Anda sehingga Anda dapat dengan mudah mengembalikan tindakan dengan menyeret skrip dari ruang kerja ke dalam post-action.
Scripting
Ada dua jenis skrip: JavaScript di File Definisi Distribusi dan Skrip Shell.
Dokumentasi terbaik tentang Shell Script yang saya temukan di WhiteBox - PackageMaker How-to , tetapi baca ini dengan hati-hati karena mengacu pada format paket lama.
Bacaan Tambahan
Masalah dan Penanganan Masalah yang Diketahui
Panel Pilih Tujuan
Pengguna disajikan dengan opsi pilih tujuan dengan hanya satu pilihan - "Instal untuk semua pengguna komputer ini". Opsi muncul secara visual dipilih, tetapi pengguna perlu mengkliknya untuk melanjutkan dengan instalasi, menyebabkan beberapa kebingungan.
Dokumentasi Apel merekomendasikan untuk digunakan <domains enable_anywhere ... />
tetapi ini memicu Pane Select Destination yang lebih buggy baru yang tidak digunakan Apple dalam Paket mereka.
Menggunakan deprecate <options rootVolumeOnly="true" />
memberi Anda Pane Pilih Tujuan lama.
Anda ingin menginstal item ke folder home pengguna saat ini.
Jawaban singkat: JANGAN MENCOBANYA!
Jawaban panjang: BENAR-BENAR; JANGAN MENCOBANYA! Baca Masalah dan Solusi Pemasang . Anda tahu apa yang saya lakukan bahkan setelah membaca ini? Saya cukup bodoh untuk mencobanya. Mengatakan pada diri sendiri, saya yakin mereka memperbaiki masalah di 10.7 atau 10.8.
Pertama-tama saya melihat dari waktu ke waktu, Destinasi Pilih Pane Bug yang disebutkan di atas. Itu seharusnya menghentikan saya, tetapi saya mengabaikannya. Jika Anda tidak ingin menghabiskan waktu seminggu setelah Anda merilis perangkat lunak Anda menjawab e-mail dukungan bahwa mereka harus mengklik sekali pilihan biru yang bagus JANGAN gunakan ini.
Anda sekarang berpikir bahwa pengguna Anda cukup pintar untuk mengetahui panelnya, bukan? Nah di sini ada satu hal lagi tentang pemasangan folder rumah, MEREKA TIDAK BEKERJA!
Saya mengujinya selama dua minggu pada sekitar 10 mesin yang berbeda dengan versi OS yang berbeda dan apa yang tidak, dan tidak pernah gagal. Jadi saya mengirimnya. Dalam satu jam dari rilis saya balas mengenang dari pengguna yang tidak bisa menginstalnya. Log mengisyaratkan masalah izin Anda tidak akan dapat memperbaikinya.
Jadi mari kita ulangi sekali lagi: Kami tidak menggunakan Installer untuk instalasi folder rumah!
RTFD untuk Selamat Datang, Baca-saya, Lisensi dan Kesimpulan tidak diterima oleh productbuild
.
Pemasang didukung sejak awal file RTFD untuk membuat layar Selamat Datang cantik dengan gambar, tetapi productbuild tidak menerimanya.
Penanganan masalah: Gunakan file dummy rtf dan ganti dalam paket dengan setelah productbuild
selesai.
Catatan: Anda juga dapat memiliki gambar Retina di dalam file RTFD. Menggunakan multi-file gambar tiff untuk ini: tiffutil -cat Welcome.tif Welcome_2x.tif -out FinalWelcome.tif
. Lebih detail .
Memulai aplikasi saat instalasi dilakukan dengan skrip BundlePostInstallScriptPath :
#!/bin/bash
LOGGED_IN_USER_ID=`id -u "${USER}"`
if [ "${COMMAND_LINE_INSTALL}" = "" ]
then
/bin/launchctl asuser "${LOGGED_IN_USER_ID}" /usr/bin/open -g PATH_OR_BUNDLE_ID
fi
exit 0
Penting untuk menjalankan aplikasi sebagai pengguna yang masuk, bukan sebagai pengguna pemasang. Ini dilakukan dengan launchctl asuser uid path . Kami juga hanya menjalankannya saat itu bukan instalasi baris perintah, dilakukan dengan alat penginstal atau Apple Remote Desktop .