¿Cómo creo un DMG atractivo para Mac OS X usando herramientas de línea de comandos?

Necesito crear un buen instalador para una aplicación Mac. Quiero que sea una imagen de disco (DMG), con un tamaño, diseño e imagen de fondo predefinidos.

Necesito hacer esto programáticamente en un script, para integrarlo en un sistema de compilación existente (más que nada un sistema de paquete, ya que solo crea instaladores. Las compilaciones se hacen por separado).

Ya he hecho la creación de DMG usando "hdiutil", lo que no he descubierto aún es cómo hacer un diseño de icono y especificar un mapa de bits de fondo.

0
agregado el autor Prof. Falken, fuente
¿No es esto algo para Ask Different?
agregado el autor Lenar Hoyt, fuente

14 Respuestas

Si desea establecer un icono de volumen personalizado, utilice el comando a continuación

/*Add a drive icon*/
cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"  


/*SetFile -c icnC will change the creator of the file to icnC*/
SetFile -c icnC //.VolumeIcon.icns

Ahora crea dmg de lectura/escritura

/*to set custom icon attribute*/
SetFile -a C /Volumes/dmgName
0
agregado
"tu camino" es el nombre DMG. (/ Volumes/dmgName)
agregado el autor Parag Bafna, fuente
Deberías copiar el archivo icns. cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"
agregado el autor Parag Bafna, fuente
¿Puedes explicar qué significa "tu camino" aquí? ¿Puedo usar cualquier archivo de iconos en el disco, y SetFile lo copiaría, o necesitaría usar un archivo que está dentro de .dmg? Solo tengo una Mac, por lo que es difícil probar si las cosas funcionarán en otras máquinas.
agregado el autor Milan Babuškov, fuente

Para aquellos de ustedes que están interesados ​​en este tema, debería mencionar cómo creo el DMG:

hdiutil create XXX.dmg -volname "YYY" -fs HFS+ -srcfolder "ZZZ"

dónde

XXX == disk image file name (duh!)
YYY == window title displayed when DMG is opened
ZZZ == Path to a folder containing the files that will be copied into the DMG
0
agregado
Está bien, pero no aborda la necesidad real (imagen de fondo, posicionamiento de los elementos en la carpeta, etc.)
agregado el autor Tom Bogle, fuente

Después de muchas investigaciones, se me ocurrió esta respuesta, y la expongo aquí como respuesta a mi propia pregunta, como referencia:

  1. Make sure that "Enable access for assistive devices" is checked in System Preferences>>Universal Access. It is required for the AppleScript to work. You may have to reboot after this change (it doesn't work otherwise on Mac OS X Server 10.4).

  2. Create a R/W DMG. It must be larger than the result will be. In this example, the bash variable "size" contains the size in Kb and the contents of the folder in the "source" bash variable will be copied into the DMG:

    hdiutil create -srcfolder "${source}" -volname "${title}" -fs HFS+ \
          -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${size}k pack.temp.dmg
    
  3. Mount the disk image, and store the device name (you might want to use sleep for a few seconds after this operation):

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. Store the background picture (in PNG format) in a folder called ".background" in the DMG, and store its name in the "backgroundPictureName" variable.

  5. Use AppleScript to set the visual styles (name of .app must be in bash variable "applicationName", use variables for the other properties as needed):

    echo '
       tell application "Finder"
         tell disk "'${title}'"
               open
               set current view of container window to icon view
               set toolbar visible of container window to false
               set statusbar visible of container window to false
               set the bounds of container window to {400, 100, 885, 430}
               set theViewOptions to the icon view options of container window
               set arrangement of theViewOptions to not arranged
               set icon size of theViewOptions to 72
               set background picture of theViewOptions to file ".background:'${backgroundPictureName}'"
               make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
               set position of item "'${applicationName}'" of container window to {100, 100}
               set position of item "Applications" of container window to {375, 100}
               update without registering applications
               delay 5
               close
         end tell
       end tell
    ' | osascript
    
  6. Finialize the DMG by setting permissions properly, compressing and releasing it:

    chmod -Rf go-w /Volumes/"${title}"
    sync
    sync
    hdiutil detach ${device}
    hdiutil convert "/pack.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "${finalDMGName}"
    rm -f /pack.temp.dmg 
    

En Snow Leopard, el AppleScript anterior no establecerá la posición del icono correctamente, parece ser un error Snow Leopard. Una solución alternativa es simplemente llamar cerrar/abrir después de configurar los iconos, es decir:

..
set position of item "'${applicationName}'" of container window to {100, 100}
set position of item "Applications" of container window to {375, 100}
close
open
0
agregado
Creo que encontré un pequeño error: hay una expulsión en AppleScript, que se realiza antes de intentar ejecutar chmod. chmod fallará porque el disco ahora se expulsa.
agregado el autor Trejkaz, fuente
Permite que AppleScript simule la entrada de mouse y teclado y un montón de otras cosas.
agregado el autor Ludvig A. Norin, fuente
Se requirió la eliminación de los permisos de escritura en la carpeta de origen en una de las versiones anteriores de hdiutil. En este artículo se supone que los comandos se ejecutan como raíz, que pueden o no ser necesarios para que funcionen todas las otras partes. La versión actual de hdiutil no se preocupa por los privilegios de escritura en la carpeta fuente.
agregado el autor Ludvig A. Norin, fuente
No he encontrado ninguna manera de esperar de manera determinista la finalización del comando 'actualizar sin registrar aplicaciones'. No estoy seguro de que necesite dormir después de "hdiutil attach", tendrá que verificar la documentación (man hdiutil). La sincronización solo debería ser necesaria para ser llamada una vez, lo hago dos veces fuera del viejo hábito desde los buenos viejos tiempos de SunOS.
agregado el autor Ludvig A. Norin, fuente
github.com/LinusU/node-appdmg <- ¡ESTO REEMPLAZA LA RESPUESTA ANTERIOR!
agregado el autor Prof. Falken, fuente
chmod es totalmente inútil porque requeriría sudo y no lograría nada. El DMG resultante es completamente de solo lectura independientemente.
agregado el autor Barry, fuente
Excelente. Dos preguntas al respecto: 1. Usted recomienda sleep después de amontonar la imagen. ¿Cuánto tiempo? ¿No es posible esperar de manera determinista la finalización del proceso? Lo mismo para delay 5 en su AppleScript. Siempre tengo cuidado con esos tiempos de espera arbitrarios, habiendo tenido una muy mala experiencia con ellos. 2. En su paso 6, llama a sync dos veces, ¿por qué?
agregado el autor Konrad Rudolph, fuente
No puedo crear el acceso directo para la carpeta "/ Aplicaciones" usando los pasos anteriores. Obtengo un "Archivo en blanco" en el lugar del acceso directo de la carpeta "/ Aplicación".
agregado el autor Nandhakumar, fuente
¿Qué hace el paso 1?
agregado el autor Stephen, fuente
Si la secuencia de comandos se cuelga hasta que se agota el tiempo en la línea "actualizar sin registrar aplicaciones", entonces el paso 1 no se ha realizado (o se ha deshecho). Acabo de descubrir esto por el camino difícil.
agregado el autor jmaynard, fuente

No vayas allí. Como desarrollador de Mac a largo plazo, puedo asegurarle que ninguna solución funciona realmente bien. Intenté muchas soluciones, pero no todas son buenas. Creo que el problema es que Apple realmente no documenta el formato de metadatos para los datos necesarios.

Así es como lo estoy haciendo durante mucho tiempo, con mucho éxito:

  1. Create a new DMG, writeable(!), big enough to hold the expected binary and extra files like readme (sparse might work).

  2. Mount the DMG and give it a layout manually in Finder or with whatever tools suits you for doing that (see FileStorm link at the bottom for a good tool). The background image is usually an image we put into a hidden folder (".something") on the DMG. Put a copy of your app there (any version, even outdated one will do). Copy other files (aliases, readme, etc.) you want there, again, outdated versions will do just fine. Make sure icons have the right sizes and positions (IOW, layout the DMG the way you want it to be).

  3. Unmount the DMG again, all settings should be stored by now.

  4. Write a create DMG script, that works as follows:

    • It copies the DMG, so the original one is never touched again.
    • It mounts the copy.
    • It replaces all files with the most up to date ones (e.g. latest app after build). You can simply use mv or ditto for that on command line. Note, when you replace a file like that, the icon will stay the same, the position will stay the same, everything but the file (or directory) content stays the same (at least with ditto, which we usually use for that task). You can of course also replace the background image with another one (just make sure it has the same dimensions).
    • After replacing the files, make the script unmount the DMG copy again.
    • Finally call hdiutil to convert the writable, to a compressed (and such not writable) DMG.

Este método puede no sonar óptimo, pero créanme, funciona muy bien en la práctica. Puede poner el DMG original (plantilla DMG) incluso bajo control de versión (por ejemplo, SVN), por lo que si alguna vez lo cambia/destruye accidentalmente, puede volver a una revisión donde todavía estaba bien. Puede agregar la plantilla DMG a su proyecto Xcode, junto con todos los demás archivos que pertenecen al DMG (archivo Léame, URL, fondo), todo bajo control de versión y luego crear un objetivo (por ejemplo, un objetivo externo llamado "Crear DMG") y allí ejecute el script DMG de arriba y agregue su antiguo objetivo principal como objetivo dependiente. Puede acceder a los archivos en el árbol de Xcode usando $ {SRCROOT} en el script (siempre es la raíz de origen de su producto) y puede acceder a los productos de compilación usando $ {BUILT_PRODUCTS_DIR} (siempre es el directorio donde Xcode crea los resultados de compilación) .

Resultado: en realidad, Xcode puede producir el DMG al final de la compilación. Un DMG que está listo para lanzar. No solo puede crear un DMG de reenvío de manera bastante fácil, de hecho puede hacerlo en un proceso automatizado (en un servidor decapitado si lo desea), utilizando xcodebuild desde la línea de comando (compilaciones nocturnas automatizadas, por ejemplo).

Con respecto al diseño inicial de la plantilla, FileStorm es una buena herramienta para hacerlo. Es comercial, pero muy poderoso y fácil de usar. La versión normal cuesta menos de $ 20, por lo que es realmente asequible. Tal vez uno puede automatizar FileStorm para crear un DMG (por ejemplo, a través de AppleScript), nunca lo intentó, pero una vez que haya encontrado la plantilla perfecta DMG, es realmente fácil actualizarla para cada lanzamiento.

0
agregado
Hemos separado el proceso del paquete del proceso de compilación, porque lo hacen diferentes personas en diferentes momentos. El proceso del paquete también crea instaladores para Windows, Windows CE, Symbian, AIX, Linux y Solaris.
agregado el autor Ludvig A. Norin, fuente
No es el mismo escenario. Agregamos productos a menudo, con poca antelación. La rutina manual mínima significa ejecutar un script que le da al producto un nombre y algunos otros atributos. Hay razones más allá de esto que nos hicieron tomar la decisión de no usar ese tipo de solución.
agregado el autor Ludvig A. Norin, fuente
Ya he descartado la idea de hacerlo de esta manera, por varias razones. Aquí hay dos de ellos: el contenido de los instaladores variará según el producto, y queremos confiar únicamente en el software instalado en las máquinas y scripts del paquete: una rutina manual única y mínima para agregar nuevos productos.
agregado el autor Ludvig A. Norin, fuente
Parece una manera fea de hacerlo, pero después de poncharme tratando los enfoques anteriores, estoy dando un giro. Pero después de reemplazar los archivos y separarlos, mi imagen no se modifica y no contiene los archivos nuevos. ¿Qué podría estar haciendo mal? hdiutil adjuntar "$ COPY_OF_IMAGE" -readwrite -mountpoint "$ STAGING_DIR" buscar "$ DEST_KM_APP" -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf cp -fR "$ SOURCE_KM_APP /" "$ DEST_KM_APP" hdiutil detach $ STAGING_DIR $ VERBOSITY
agregado el autor Tom Bogle, fuente
Parece que este enfoque funciona: crazyedy.com/tech/?p=535
agregado el autor Tom Bogle, fuente
Este es el mismo escenario que tenemos. Tenemos más de una docena de productos; cada uno tiene un DMG completamente diferente. La creación de una plantilla DMG por producto es una tarea de una sola vez y le lleva un par de minutos. ¿Y qué quiere decir con "instalador"? ¿PKG/MPKG instalan paquetes?
agregado el autor Mecki, fuente
@Ivan: Tienes razón, solucionando la respuesta. Perdón por ese error tipográfico
agregado el autor Mecki, fuente
Probablemente te estés refiriendo a hdiutil, no a hdutil.
agregado el autor Ivan Vučica, fuente
Si desea que se abra la ventana raíz de la imagen del disco cuando se monta la imagen, agregue lo siguiente al paso 2: bless --openfolder "/ Volumes/My Great Software" .
agregado el autor bleater, fuente
Para mí, la versión anterior no funcionaba (se negaría constantemente a crear el enlace Aplicaciones). El uso de este método funcionó bien y de manera confiable a pesar de requerir un proceso manual para configurarlo.
agregado el autor Chris R, fuente

Estas respuestas son demasiado complicadas y los tiempos han cambiado. Lo siguiente funciona bien en 10.9, los permisos son correctos y se ve bien.

Crear un DMG de solo lectura desde un directorio

#!/bin/sh
# create_dmg Frobulator Frobulator.dmg path/to/frobulator/dir [ 'Your Code Sign Identity' ]
set -e

VOLNAME="$1"
DMG="$2"
SRC_DIR="$3"
CODESIGN_IDENTITY="$4"

hdiutil create -srcfolder "$SRC_DIR" \
  -volname "$VOLNAME" \
  -fs HFS+ -fsargs "-c c=64,a=16,e=16" \
  -format UDZO -imagekey zlib-level=9 "$DMG"

if [ -n "$CODESIGN_IDENTITY" ]; then
  codesign -s "$CODESIGN_IDENTITY" -v "$DMG"
fi

Crear DMG de solo lectura con un ícono (tipo .icns)

#!/bin/sh
# create_dmg_with_icon Frobulator Frobulator.dmg path/to/frobulator/dir path/to/someicon.icns [ 'Your Code Sign Identity' ]
set -e
VOLNAME="$1"
DMG="$2"
SRC_DIR="$3"
ICON_FILE="$4"
CODESIGN_IDENTITY="$5"

TMP_DMG="$(mktemp -u -t XXXXXXX)"
trap 'RESULT=$?; rm -f "$TMP_DMG"; exit $RESULT' INT QUIT TERM EXIT
hdiutil create -srcfolder "$SRC_DIR" -volname "$VOLNAME" -fs HFS+ \
               -fsargs "-c c=64,a=16,e=16" -format UDRW "$TMP_DMG"
TMP_DMG="${TMP_DMG}.dmg" # because OSX appends .dmg
DEVICE="$(hdiutil attach -readwrite -noautoopen "$TMP_DMG" | awk 'NR==1{print$1}')"
VOLUME="$(mount | grep "$DEVICE" | sed 's/^[^ ]* on //;s/ ([^)]*)$//')"
# start of DMG changes
cp "$ICON_FILE" "$VOLUME/.VolumeIcon.icns"
SetFile -c icnC "$VOLUME/.VolumeIcon.icns"
SetFile -a C "$VOLUME"
# end of DMG changes
hdiutil detach "$DEVICE"
hdiutil convert "$TMP_DMG" -format UDZO -imagekey zlib-level=9 -o "$DMG"
if [ -n "$CODESIGN_IDENTITY" ]; then
  codesign -s "$CODESIGN_IDENTITY" -v "$DMG"
fi

Si tiene que suceder algo más, lo más fácil es hacer una copia temporal del SRC_DIR y aplicarle cambios antes de crear un DMG.

0
agregado
Esta respuesta no agrega nada a lo que se ha escrito anteriormente, y tampoco responde a la pregunta original (no se trata solo de poner un ícono en el dmg, o cómo firmarlo; la pregunta es acerca de agregar gráficos e iconos posicionados mediante programación a a dmg).
agregado el autor Ludvig A. Norin, fuente

Encontré esta gran aplicación de mac para automatizar el proceso: http://www.araelium.com/dmgcanvas/ debe echar un vistazo si está creando el instalador dmg para su aplicación mac

0
agregado
agregado el autor Prof. Falken, fuente
Este es gratuito: enlace
agregado el autor NetworkSys Co. Ltd, fuente
Tenga en cuenta que este no es un programa gratuito, por lo que no es adecuado para muchos entornos.
agregado el autor jmaynard, fuente

Hay un pequeño script de Bash llamado create-dmg que crea DMG sofisticados con fondos personalizados, posicionamiento personalizado de iconos y nombre del volumen

Lo construí hace muchos años para la compañía que dirigía en ese momento; sobrevive gracias a la contribución de otras personas desde entonces y, según los informes, funciona bien.

También hay node-appdmg que parece un esfuerzo más moderno y activo basado en Node.js; échale un vistazo también.

0
agregado
agregado el autor David Karlsson, fuente
create-dmg hace bien el icono de posición NOT . Si necesita esta característica, no la use.
agregado el autor laike9m, fuente
@AndreyTarantsov Ya hay un problema github.com/andreyvit/create-dmg/issues/18 .
agregado el autor laike9m, fuente
@AndreyTarantsov Eh, es su proyecto, pensé que usted es consciente de todos esos problemas ...
agregado el autor laike9m, fuente
@ laike9m ¿Puedes reportarlo como un problema si conoces detalles? Quizás alguien lo arregle.
agregado el autor Andrey Tarantsov, fuente
@ laike9m Interesante, no lo sabía. Gracias.
agregado el autor Andrey Tarantsov, fuente
@ laike9m Han pasado más de 5 años desde la última vez que lo toqué. Realmente no considero que DMG sea la mejor forma de distribuir software de Mac. Por lo tanto, sobrevive gracias a las contribuciones de los demás; es de esperar que alguien también se dé cuenta del problema con los iconos.
agregado el autor Andrey Tarantsov, fuente
@Zmey Bueno como usuario, prefiero los archivos zip de lejos. Puntos de bonificación por copia automática a /Aplicaciones si la aplicación detecta que se está ejecutando desde ~/Descargas . Ver también este viejo artículo de John Gruber .
agregado el autor Andrey Tarantsov, fuente
agregado el autor Andrey Tarantsov, fuente
¡Esto funciona genial!
agregado el autor vpicaver, fuente
@AndreyTarantsov ayuda mucho.
agregado el autor simon xu, fuente
El enlace a tu script bash está roto. ¿Puedes ponerlo en una esencia en github.com? Gracias
agregado el autor dquimper, fuente
@AndreyTarantsov ¡Gracias! Es una idea muy interesante.
agregado el autor Zmey, fuente
@AndreyTarantsov ¿Cuál cree que es la mejor distribución de aplicaciones para Mac?
agregado el autor Zmey, fuente
@AndreyTarantsov buen trabajo, gracias!
agregado el autor finnan, fuente

.DS_Store files almacena la configuración de Windows en Mac. La configuración de Windows incluye el diseño de los iconos, el fondo de la ventana, el tamaño de la ventana, etc. El archivo .DS_Store es necesario para crear la ventana de las imágenes montadas para preservar la disposición de los archivos y el fondo de Windows.

Una vez que haya creado el archivo .DS_Store, puede copiarlo a su instalador creado (DMG).

0
agregado
Pero primero agregue una imagen de fondo al dmg al nombrarlo como .background.png y luego usando Cmd-J para agregar esa imagen (!) Al fondo.
agregado el autor Gijs, fuente

Mi aplicación, DropDMG , es una manera fácil de crear imágenes de disco con imágenes de fondo, diseños de iconos, volumen personalizado iconos y acuerdos de licencia de software. Se puede controlar desde un sistema de compilación mediante la herramienta de línea de comandos "dropdmg" o AppleScript. Si lo desea, la imagen y la licencia de los archivos RTF se pueden almacenar en su sistema de control de versiones.

0
agregado
¡Muchas gracias! ¿Es posible cambiar el tamaño sin la imagen de fondo?
agregado el autor avi, fuente
Se ve bien, pero no parece tener la opción de cambiar el tamaño de la ventana.
agregado el autor avi, fuente
agregado el autor Prof. Falken, fuente
Eso se ve muy interesante.
agregado el autor Konrad Rudolph, fuente
Mi equipo tiene esto funcionando de manera hermosa y automática en un servidor de compilación Jenkins CI, completo con fondo, arrastre al alias de Aplicaciones. Ejecute, no camine, a DropDMG para hacer imágenes de disco.
agregado el autor Paul Collins, fuente
@avi DropDMG ajusta automáticamente la ventana a la imagen de fondo que establezca (o inserción en esa imagen si se desea).
agregado el autor Michael Tsai, fuente
@avi Si no está utilizando una imagen de fondo, puede establecer las dimensiones con el "BlankBackgroundSize" preferencia esotérica .
agregado el autor Michael Tsai, fuente
Buena aplicación, la compraré luego de que mi prueba expire.
agregado el autor kilik52, fuente

También necesito usar el enfoque de línea de comando para hacer el empaquetado y la creación de dmg "programáticamente en un script". La mejor respuesta que encontré hasta ahora es del marco de creación de versiones del Proyecto Adium (Ver R1). Existe un script personalizado (AdiumApplescriptRunner) que le permite evitar la interacción de OSX WindowsServer GUI. El enfoque "osascript applescript.scpt" requiere que inicie sesión como constructor y ejecute la creación de dmg desde una sesión de línea de comando vt100.

El sistema de administración de paquetes de OSX no es tan avanzado en comparación con otros Unixen que pueden hacer esta tarea de forma fácil y sistemática.

R1: http://hg.adium.im/adium-1.4/file/00d944a3ef16/Release

0
agregado

Acabo de escribir una nueva utilidad de línea de comandos (amigable) para hacer esto. No se basa en Finder/AppleScript ni en ninguna de las API (obsoletas) de Alias ​​Manager, y es fácil de configurar y usar.

De todos modos, cualquiera que esté interesado puede encontrarlo en PyPi ; la documentación está disponible en Read The Docs .

0
agregado

Actualizando esta pregunta proporcionando esta respuesta.

appdmg is a simple, easy-to-use, open-source command line program that creates dmg-files from a simple json specification. Take a look at the readme at the official website:

https://github.com/LinusU/node-appdmg

Ejemplo rápido:

  1. Install appdmg

    npm install -g appdmg
    
  2. Write a json file (spec.json)

    {
      "title": "Test Title",
      "background": "background.png",
      "icon-size": 80,
      "contents": [
        { "x": 192, "y": 344, "type": "file", "path": "TestApp.app" },
        { "x": 448, "y": 344, "type": "link", "path": "/Applications" }
      ]
    }
    
  3. Run program

    appdmg spec.json test.dmg
    

(descargo de responsabilidad. Soy el creador de appdmg)

0
agregado
@Creator: ¿puede por favor avanzar como esta GUI de oferta sin tener que arrastrar y soltar? s.sudre.free.fr/Software/Packages/about.html
agregado el autor YumYumYum, fuente
simple y efectivo El único inconveniente es que requiere la instalación de npm
agregado el autor Jack James, fuente
@Joey, ¿podrías abrir un problema en el repositorio de Github si no funciona para ti?
agregado el autor Linus Unnebäck, fuente
Si el archivo .app no ​​está en la misma carpeta que el archivo json, esto no funciona, da el error "archivo no encontrado" cuando especifica una ruta relativa en "ruta"
agregado el autor Joey, fuente

Finalmente lo conseguí trabajando en mi propio proyecto (que sucede en Xcode). Agregar estos 3 scripts a su fase de construcción creará automáticamente una imagen de disco para su producto que sea agradable y ordenada. Todo lo que tienes que hacer es construir tu proyecto y el DMG estará esperando en la carpeta de tus productos.

Script 1 (Crear imagen de disco temporal):

#!/bin/bash
#Create a R/W DMG

dir="$TEMP_FILES_DIR/disk"
dmg="$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg"

rm -rf "$dir"
mkdir "$dir"
cp -R "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app" "$dir"
ln -s "/Applications" "$dir/Applications"
mkdir "$dir/.background"
cp "$PROJECT_DIR/$PROJECT_NAME/some_image.png" "$dir/.background"
rm -f "$dmg"
hdiutil create "$dmg" -srcfolder "$dir" -volname "$PRODUCT_NAME" -format UDRW

#Mount the disk image, and store the device name
hdiutil attach "$dmg" -noverify -noautoopen -readwrite

Script 2 (Establecer script de propiedades de ventana):

#!/usr/bin/osascript
#get the dimensions of the main window using a bash script

set {width, height, scale} to words of (do shell script "system_profiler SPDisplaysDataType | awk '/Main Display: Yes/{found=1} /Resolution/{width=$2; height=$4} /Retina/{scale=($2 == \"Yes\" ? 2 : 1)} /^ {8}[^ ]+/{if(found) {exit}; scale=1} END{printf \"%d %d %d\\n\", width, height, scale}'")
set x to ((width/2)/scale)
set y to ((height/2)/scale)

#get the product name using a bash script
set {product_name} to words of (do shell script "printf \"%s\", $PRODUCT_NAME")
set background to alias ("Volumes:"&product_name&":.background:some_image.png")

tell application "Finder"
    tell disk product_name
        open
        set current view of container window to icon view
        set toolbar visible of container window to false
        set statusbar visible of container window to false
        set the bounds of container window to {x, y, (x + 479), (y + 383)}
        set theViewOptions to the icon view options of container window
        set arrangement of theViewOptions to not arranged
        set icon size of theViewOptions to 128
        set background picture of theViewOptions to background
        set position of item (product_name & ".app") of container window to {100, 225}
        set position of item "Applications" of container window to {375, 225}
        update without registering applications
        close
    end tell
end tell

La medición anterior para el trabajo de ventana para mi proyecto específicamente debido al tamaño de mi imagen de fondo y resolución de icono; es posible que necesite modificar estos valores para su propio proyecto.

Script 3 (Hacer script de imagen de disco final):

#!/bin/bash
dir="$TEMP_FILES_DIR/disk"
cp "$PROJECT_DIR/$PROJECT_NAME/some_other_image.png" "$dir/"

#unmount the temp image file, then convert it to final image file
sync
sync
hdiutil detach /Volumes/$PRODUCT_NAME
rm -f "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"
hdiutil convert "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"
rm -f "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg"

#Change the icon of the image file
sips -i "$dir/some_other_image.png"
DeRez -only icns "$dir/some_other_image.png" > "$dir/tmpicns.rsrc"
Rez -append "$dir/tmpicns.rsrc" -o "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"
SetFile -a C "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"

rm -rf "$dir"

¡Asegúrate de que los archivos de imagen que estás usando estén en el directorio $ PROJECT_DIR/$ PROJECT_NAME /!

0
agregado
Está creando una imagen de disco en blanco en mi proyecto. Cualquier sugerencia.
agregado el autor ManiaChamp, fuente
La parte del script de Shell solo funciona, pero ¿cómo puedo agregar el script de Apple con Shell Script en RunScript en Build Phase? Está mostrando un error, cada declaración del script de Apple es símbolo no encontrado.
agregado el autor ManiaChamp, fuente

Para crear un DMG atractivo, ahora puedes usar algunas fuentes abiertas bien escritas:

0
agregado
Decidí instalar node-appdmg. Es bueno para lo que necesito.
agregado el autor Pamela Cook - LightBe Corp, fuente
El enlace a dmgbuild no funciona.
agregado el autor Pamela Cook - LightBe Corp, fuente
@ PamelaCook-LightBeCorp En caso de que todavía esté interesado. El enlace a dmgbuild ha sido arreglado.
agregado el autor SubOptimal, fuente
Puede ser que lo hayan movido. Puede usar create-dmg y node-appdmg. Estoy usando create-dmg. Es bueno.
agregado el autor Anni S, fuente