Örnek projemizin iki oluşturma hedefi vardır: HelloWorld.app ve Helper.app. Her biri için bir bileşen paketi hazırlıyoruz ve bunları bir ürün arşivinde birleştiriyoruz .
Bir bileşen, bir paket OS X yükleyicisi tarafından kurulacak yükleme içerir. Bir bileşen paketi kendi başına kurulabilse de, genellikle bir ürün arşivine eklenir .
Başarılı bir "Derleme ve Arşivleme" işleminden sonra Terminal'de $ BUILT_PRODUCTS_DIR dosyasını açın.
$ cd ~/Library/Developer/Xcode/DerivedData/.../InstallationBuildProductsLocation
$ pkgbuild --analyze --root ./HelloWorld.app HelloWorldAppComponents.plist
$ pkgbuild --analyze --root ./Helper.app HelperAppComponents.plist
Bu bize bileşen-plist verir, değer açıklamasını "Bileşen Özellik Listesi" bölümünde bulabilirsiniz. pkgbuild -root bileşen paketlerini oluşturur, varsayılan özelliklerden herhangi birini değiştirmeniz gerekmiyorsa , aşağıdaki komutta --component-plist parametresini atlayabilirsiniz .
productbuild - sonuçları bir Dağıtım Tanımında sentezler .
$ 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
In Distribution.xml Eğer başlık, arka plan, karşılama, Benioku'da, lisans ve benzeri şeyleri değiştirebilir. Eğer çevirmek bileşen paketleri bir içine bu komutla ve dağıtım tanımını ürün arşivde :
$ productbuild --distribution ./Distribution.xml \
--package-path . \
./Installer.pkg
Neyin mümkün olduğunu görmek için iTunes Installers Distribution.xml dosyasına göz atmanızı öneririm . "Install iTunes.pkg" dosyasını aşağıdakilerle çıkarabilirsiniz:
$ pkgutil --expand "Install iTunes.pkg" "Install iTunes"
Bir araya getirelim
Projemde genellikle Dağıtım.xml, bileşen-plists, kaynaklar ve komut dosyaları gibi paket içeren bir klasör var.
Yalnızca yükleme sırasında Komut dosyasını çalıştır olarak ayarlanan "Generate Package" adlı bir Komut Dosyası Oluşturma Safhası ekleyin :
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}"
Paketi, ürün oluşturma ile oluşturulduktan sonra değiştirmeniz gerekmiyorsapkgutil --expand
ve pkgutil --flatten
adımlarından kurtulabilirsiniz . Ayrıca kullanabilirsiniz --sign üzerinde parametresine productbuild yerine çalışan productsign .
OS X Yükleyicisini imzalama
Paketler, Developer Certificate Utility'den indirebileceğiniz Developer ID Installer sertifikası ile imzalanır .
İmzalama, pkgbuild , productbuild veya productsign--sign "Developer ID Installer: John Doe"
parametresi ile yapılır .
Productbuild kullanarak imzalı bir ürün arşivi oluşturacaksanız , bileşen paketlerini imzalamanın bir nedeni olmadığını unutmayın .
Tüm yol: Paketi Xcode Arşivine Kopyala
Xcode Arşivine bir şey kopyalamak için Komut Dosyası Çalıştırma Derecesini Çalıştırma Aşamasını kullanamayız . Bunun için bir Şema Eylemi kullanmamız gerekiyor.
Düzeni düzenleyin ve Arşivi genişletin. Ardından işlem sonrası seçeneğini tıklayın ve Yeni Çalıştırılan Komut Dosyası İşlemi ekleyin :
Xcode 6'da:
#!/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
Xcode 5'te, PKG
bunun için şu değeri kullanın:
PKG="${OBJROOT}/ArchiveIntermediates/${TARGET_NAME}/BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"
Sürüm denetiminizin Xcode Şeması bilgilerini depolamaması durumunda, bunu projenize kabuk komut dosyası olarak eklemenizi öneririm;
Komut
İki farklı komut dosyası türü vardır: Dağıtım Tanımlama Dosyaları ve Kabuk Komut Dosyaları'nda JavaScript .
Kabuk Komut Dosyaları hakkında en iyi belgeleri WhiteBox'ta buldum - PackageMaker Nasıl Yapılır , ancak eski paket formatına atıfta bulunduğundan bunu dikkatle okuyun.
İlave Okuma
Bilinen Sorunlar ve Geçici Çözümler
Hedef Seçim Bölmesi
Kullanıcıya, yalnızca tek bir seçim olan hedef seçme seçeneği sunulur - "Bu bilgisayarın tüm kullanıcıları için yükle". Seçenek görsel olarak seçili olarak görünür, ancak kullanıcının kuruluma devam etmek için üzerine tıklaması gerekir ve bu da biraz karışıklığa neden olur.
Elmalar Belgeleri kullanılmasını önerir, <domains enable_anywhere ... />
ancak bu, Apple'ın Paketlerinin hiçbirinde kullanmadığı yeni daha bugun Hedef Seçim Bölmesini tetikler.
Kullanımdan kaldırmayı kullanarak <options rootVolumeOnly="true" />
size eski Hedef Seçim Bölmesini verin.
Geçerli kullanıcının ana klasörüne öğe yüklemek istiyorsunuz.
Kısa cevap: BUNU DENEMEYİN!
Uzun cevap: GERÇEKTEN; BUNU DENEME! Yükleyici Sorunları ve Çözümlerini okuyun . Bunu okuduktan sonra bile ne yaptığımı biliyor musun? Denemek için yeterince aptalcaydım. Kendime, sorunları 10.7 veya 10.8'de çözdüklerinden emin olduğumu söylüyorum.
Her şeyden önce zaman zaman yukarıda belirtilen Hedef Seçim Bölmesi Hatasını gördüm. Bu beni durdurmalıydı, ama görmezden geldim. Yazılımınızı yayınladıktan sonra bir hafta harcamak istemiyorsanız, destek e-postalarını yanıtlamak zorunda kaldıklarında, hoş mavi seçim bir kez bunu KULLANMAYIN.
Artık kullanıcılarınızın paneli anlayacak kadar akıllı olduğunu düşünüyorsunuz, değil mi? İşte ana klasör yüklemesi hakkında başka bir şey, ÇALIŞMAYIN!
İki hafta boyunca farklı işletim sistemi sürümlerine sahip 10 farklı makinede test ettim ve ne yapmadım ve asla başarısız olmadı. Ben de gönderdim. Yayınlandıktan bir saat sonra, yükleyemeyen kullanıcılardan geri döndüm. Günlükler, düzeltemeyeceğiniz izin sorunlarına işaret etti.
Şimdi bir kez daha tekrarlayalım: Yükleyiciyi ana klasör yüklemeleri için kullanmayız!
Hoş Geldiniz, Beni Oku, Lisans ve Sonuç için RTFD tarafından kabul edilmez productbuild
.
Installer, RTFD dosyalarının başından beri resimlerle hoş karşılama ekranları yapmak için destekledi, ancak ürün geliştirme bunları kabul etmiyor.
Geçici çözümler: Sahte bir rtf dosyası kullanın ve paketin içinde bittikten sonra değiştirin productbuild
.
Not: Ayrıca, RTFD dosyasının içinde Retina görüntüleri de olabilir. Bunun için çok görüntü tiff dosyaları kullanın: tiffutil -cat Welcome.tif Welcome_2x.tif -out FinalWelcome.tif
. Daha fazla ayrıntı .
Kurulum bir BundlePostInstallScriptPath komut dosyası ile tamamlandığında uygulama başlatma :
#!/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
Uygulamayı yükleyici kullanıcı olarak değil, oturum açmış kullanıcı olarak çalıştırmak önemlidir. Bu, launchctl asuser uid yolu ile yapılır . Ayrıca, yalnızca bir yükleyici aracı veya Apple Remote Desktop ile yapılan bir komut satırı yüklemesi olmadığında çalıştırırız .